不,你有正确的方法,你只需要轻轻一推。请参见下面的示例。
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 观察者。我个人更喜欢这个而不是过滤器,因为你更多地以这种方式解耦你的类。而且我倾向于喜欢适当的关注点分离,所以..
# rails generate observer Forum
class ForumObserver < ActiveRecord::Observer
def after_save (forum)
forum.topics.each(&:close!) unless forum.active
end
end
我假设一旦这些记录被停用,它们就不会再被激活。然而,无论如何,用于处理相反情况的附加功能的代码可以忽略不计。
PS如果您不熟悉&:handler语法,它只是映射到可枚举中每个项目的函数或变量的快捷方式。