2014-12-15 4 views
0

Я использую рельсы 4.1.5 и ruby ​​2.1.2.state_machine update еще одна модель

У меня есть две модели: event и record

Довольно стандартной ассоциации: event has_many records и record belongs_to event.

Оба event и record имеют конечный автомат. Я использую state_machine камень (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 = state machine?

Можно ли обойти это без использования наблюдателей?

Любая помощь оценена! Благодаря!

+0

dang. удар? : ^) – patrick

ответ

0

Чтобы решить эту проблему, я воспользовался услугами наблюдателей.

Для этого необходимо сначала поместить следующее в ваш 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 

Надеется, что это помогает кому-то.

Смежные вопросы