has_many :through、cache、touch和counter_cache的问题

4
我在我的应用程序中有很多has_many :through关系。我正在广泛展示与此相关的信息,例如连接对象的数量。每当用户更新关系时,连接表都会被修改,我可以通过Sweepers捕获到这一点。
问题在于,连接表条目被删除,而不是销毁。如果关系不存在了,我没有合理的方法来检测它,我从缓存中显示的信息是误导性的。所有像:touch => true或:counter_cache => true的东西部分起作用。如果关系被更新或创建,它会增加。但是,如果用户删除关系,什么也不会发生。:counter_cache被破坏,:touch不触发。
垃圾解决方案是在控制器中调用.touch,当保存主模型时。这种方法似乎非常不专业。这应该在模型逻辑中处理,而不是在控制器中。
我觉得我错过了一些重要的东西,但是无法理解这个问题。有人能够对这个问题提出一些见解吗?
2个回答

1
猴子补丁 ActiveRecord 并不是必需的。在定义关联时,将 :dependent 选项设置为 :destroy 即可。
class Book < ActiveRecord::Base
  has_many :authorships, :dependent => :destroy
  has_many :authors, :through => :authorships, :dependent => :destroy
end

如果您只想为联接模型(authorships)添加回调函数,您只需要在关联模型(authors)上添加 dependent: :destroy 即可。 - tight

0

检查一下马克·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,情况可能会有所不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接