2010-09-20 4 views
1

Предположим, что у меня есть простые модели First и Second, и существует некоторая связь от Second с использованием belongs_to :first. Теперь я хочу что-то сделать с Second, когда сохраняется First. Но я не хочу настраивать обратный вызов after_save в First, чтобы иметь дело с Second.Настройка обратного вызова ActiveRecord из разных моделей

Я хочу, чтобы мои модели были чистыми и не подозревали друг друга как можно больше. Я всегда придерживаюсь лучших практик в инкапсуляции объектов, и это делает мою жизнь проще, всегда.

Поэтому, естественно, так как after_save является методом класса, я пытался настроить эту функцию обратного вызова в Second, как это:

class Second < ActiveRecord::Base 

    belongs_to :first 

    First.after_save do |record| 
    if that = Second.find_by_first_id(record.id) 
     # grow magic mushrooms here... 
    end 
    end 
end 

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

ответ

3

Возможно, было бы лучше настроить observer, что-то вроде «FirstObserver» и написать обратный вызов после сохранения.

+0

Действительно, наблюдатель решение моей проблемы, я не знал об их существовании, спасибо. – skrat

4

Вы можете сделать это с помощью наблюдателя:

class FirstObserver < ActiveRecord::Observer 
    def after_save(first) 
    ... 
    end 
end 

Не забудьте включить наблюдателя в вашем config/application.rb:

config.active_record.observers = :first_observer 
0

Попробуйте это:

First.class_eval do 
    def after_save record 
    #mashrooooms 
    end 
end 
Смежные вопросы