拆分使用两个状态机的ActiveRecord模型

时间:2014-08-06 21:41:38

标签: ruby-on-rails activerecord encapsulation state-machine

我有一个使用两个state machines

的模型
class MyModel < ActiveRecord::Base

  state_machine :call_state, :initial => :pending do
    event :start do
      transition :pending => :started
    end

    event :restart do
      transition :started => :pending
    end

    event :finish do
      transition :started => :finished
    end
  end

  state_machine :payment_state, :initial => :unpaid  do
    event :pay do
      transition :unpaid => :paid
    end

    event :pay_back do
      transition :paid => :paid_back
    end

    event :reject_payment do
      transition :unpaid => :rejected
    end
  end

  #tons of methods related with call_state
  #tons of methods related with payment_state
end

我想将此ActiveRecord模型拆分为三个:

  1. 用于封装与call_state相关的定义和方法的模块/类
  2. 用于封装与payment_state相关的定义和方法的模块/类
  3. 同时使用的模块/类。第三个模块/类可以有像

    这样的方法
    def can_call?
      xxx.paid? and yyy.can_start?
    end
    
  4. 其中xxx / yyy可以是MyModel实例,也可以是包装类中的方法。我不知道......

    问题是:这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

简短回答:使用ActiveSupport::Concern将状态机分解为模块。

更长的版本:您可以查看How to define a state_machine in a Concern?,海报回答相同的问题。

希望这有帮助