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