Нет, у вас правильный подход, вам просто нужно слегка подтолкнуть. Смотрите пример ниже.
class Forum < ActiveRecord::Base
has_many :topics
after_save :close_topics!
def close!
self.active = false
self.save!
end
private
def close_topics!
self.topics.each(&:close!) unless self.active
end
end
class Topic < ActiveRecord::Base
belongs_to :forum
def close!
self.active = false
self.save!
end
end
Вы также можете использовать ActiveRecord Observer . Лично я предпочитаю это фильтру, так как вы больше разделяете свои занятия таким образом. И я склонен любить правильное разделение интересов, поэтому ..
# rails generate observer Forum
class ForumObserver < ActiveRecord::Observer
def after_save (forum)
forum.topics.each(&:close!) unless forum.active
end
end
Я предполагаю, что как только эти записи будут деактивированы, они больше не станут активными. Однако, несмотря на это, код для дополнительной функциональности для обработки противоположного случая незначителен.
P.S. Если вы не знакомы с синтаксисом &:handler
, это просто ярлык для отображения функции или переменной для каждого элемента в перечисляемом.