state_machine更新另一个模型

时间:2014-12-15 12:42:40

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

我使用的是rails 4.1.5和ruby 2.1.2。

我有两个型号: eventrecord

非常标准的关联:event has_many recordsrecord belongs_to event

eventrecord都有状态机。我正在使用state_machine gem(https://github.com/pluginaweek/state_machine

我正试图找出一种方法,当event被取消时,它会更新所有关联的records并将其设置为取消。

我通过控制器实现了这一点,但我尝试订阅瘦视图,愚蠢的控制器,胖模型方法,我试图确保没有任何东西滑过裂缝......

以下是我event模型的摘录:

state_machine :initial => :open do
 # event to handle cancelling
 # This is a final state
 event :cancel do
  transition :open => :cancelled
  self.records.each do |record|
   record.cancel
  end
 end
end

显然还有很多其他过渡等等,但为了简单起见,我将其浓缩了......

我从Rails得到的错误是:

undefined method `records' for #<StateMachine::Event:0x007f58bada9750>

所以我假设当我放self.records.each它正在制作自我=状态机?

无论如何不使用观察员来解决这个问题?

任何帮助表示赞赏!谢谢!

1 个答案:

答案 0 :(得分:0)

为了解决这个问题,我最终使用了Observers。

要执行此操作,您需要先将以下内容放入Gemfile

gem 'rails-observers'

然后到您的config/application.rb文件:

config.active_record.observers = :event_observer

在这种情况下,'event'是我的模型的名称。

然后在app/models/event_observer.rb我添加了:

class EventObserver < ActiveModel::Observer
    # Callback for :cancel event after the transition is performed
    def after_cancel(event, transition)
        # Cancel each record associated to this event.
        event.records.each do |record|
            record.cancel
        end
    end
end

希望这有助于某人。