设计模式:Rails中来自子状态的父级的聚合状态

时间:2011-10-24 13:50:03

标签: ruby-on-rails ruby parent-child state-machine

我有一个会议模型,有很多参与者。每个参与者可以针对会议采取多种行动(注册,接受,拒绝等)。会议状态(待定,确认等)取决于每个参与者的最新行动及其自身属性(过期日期等)。

例如,如果所有参与者都接受,则会议状态将被“确认”。但是,如果在确认会议后,一位参与者提议新的时间(由于时间冲突),那么会议现在变为“待定”。

我应该如何在会议中建模状态?我应该序列化(即,在事件表中创建latest_state列)当前状态吗?如果是这样,我如何使用基于子对象操作的状态机?

谢谢。

1 个答案:

答案 0 :(得分:0)

最佳解决方案可能是在参与者模型更新时触发会议状态更新:

class Participant < ActiveRecord::Base
  belongs_to :meeting
  after_update :update_meeting_after_change

  def update_meeting_after_change
    self.meeting.update_status if self.status_changed?
  end
end

class Meeting < ActiveRecord::Base
  has_many :participants

  def update_status
    #logic here
  end
end
如果在更新期间self.status_changed?的{​​{1}}属性发生了更改,

true将返回Participant