4

我的应用程序中有很多 has_many :through 关系。我正在扩展显示与此相关的信息,例如连接对象的数量。每当用户更新关系时,连接表都会被修改,我可以捕捉到我的 Sweepers。

问题是,连接表条目被删除,而不是被破坏。如果关系消失了,我就没有合理的方法来检测这一点,并且我正在从缓存中显示误导性信息。:touch => true 或 :counter_cache => true 之类的所有内容都可以部分工作。如果更新或创建关系,它会增加。但是,如果用户删除关系,则不会发生任何事情。:counter_cache 坏了, :touch 没有触发。

垃圾解决方案是在保存主模型时在控制器中调用 .touch 。这种作品,但看起来真的很不专业。这应该在模型逻辑中,而不是在控制器中。

我觉得我错过了一些大事,但我无法理解这一点。任何人都可以对这个问题有所了解吗?

4

2 回答 2

1

Monkey 修补 Active Record 不是必需的。定义关联时,将:dependent选项设置为:destroy

class Book < ActiveRecord::Base
  has_many :authorships, :dependent => :destroy
  has_many :authors, :through => :authorships, :dependent => :destroy
end
于 2013-02-19T19:10:27.180 回答
0

检查 Mark S. 为回答他自己的问题而编写的猴子补丁:如何在 Rails 中为每个表创建完整的审计日志?

ActiveRecord::Associations::HasManyThroughAssociation.class_eval do 
  def delete_records(records)
    klass = @reflection.through_reflection.klass
    records.each do |associate|
      klass.destroy_all(construct_join_attributes(associate))
    end
  end
end

它也可能对您的问题有用。请注意,这是在 Rails 2 中。如果您已经在使用 Rails 3,情况可能会有所不同。

于 2010-12-07T01:57:49.767 回答