【问题标题】:state_machine update another modelstate_machine 更新另一个模型
【发布时间】:2015-02-23 08:43:54
【问题描述】:

我正在使用 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 时,它正在使 self = 状态机?

有没有办法在不使用观察者的情况下解决这个问题?

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

【问题讨论】:

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


    【解决方案1】:

    为了解决这个问题,我最终使用了观察者。

    为此,您需要先将以下内容放入您的Gemfile

    gem 'rails-observers'

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

    config.active_record.observers = :event_observer
    

    在这种情况下,“事件”是我的模型的名称。

    然后在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
    

    希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 2023-03-08
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 2016-08-22
      • 2019-01-23
      相关资源
      最近更新 更多