0

我有两个模型,论坛和主题,论坛有很多主题。每个都有一个活跃的布尔值。当我在论坛上翻转活动标志时,我希望其主题也都翻转其标志。我的想法是在 before_save def before_save 中执行此操作,除非 self.active?self.topics.each{|topic| topic.close} 结束

在Topic中,我定义了close方法:def close self.active = false self.save end

我在这里采取了错误的方法(我应该在其他地方做吗,比如在控制器中?)我没有收到任何错误,但是当我将标志设置为 false 时没有任何反应(我不一定要翻转所有将论坛设置为活动时要活动的主题,所以我只需要这样做)。

谢谢

4

1 回答 1

0

不,你有正确的方法,你只需要轻轻一推。请参见下面的示例。

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语法,它只是映射到可枚举中每个项目的函数或变量的快捷方式。

于 2011-10-11T05:10:23.043 回答