ActiveRecord::Enumを使って状態遷移するやつを自作した話2
gem化しました!!!
https://github.com/jiikko/huwahuwa_state
ActiveRecord::Enumを使って状態遷移するやつを自作した話
moduleに切出したら汚物が目に入りにくくなっててよくなった。でもARべったりなのでテストめんどくて最悪。
module AiState extend ActiveSupport::Concern included do def self.ai_status(status_name, from: , &block) define_method "can_#{status_name}?" do from.map(&:to_s).include?(self.status) ? true : false end class_variable_set("@@_block_#{status_name}", block) end end def update_status(status_name) raise('想定していな遷移だ') unless send("can_#{status_name}?") self.class.class_variable_get("@@_block_#{status_name}").call(self) end end class InvoiceStatus < ActiveRecord::Base include AiState enum status: [ :published, :ng, :checked, ] ai_status :published, from: [:ng] do |record| # なんかする record.published! # なんかする end ai_status :ng, from: [:published] do |record| # なんかする record.ng! # なんかする end ai_status :checked, from: [:published] do |record| # なんかする record.checked! # なんかする end end