在“has_many through”关联中,“dependent => destroy”表示销毁依赖项。

57

显然,在使用:through选项时,dependent => destroy被忽略了。

所以我有这个...

class Comment < ActiveRecord::Base
  has_many :comment_users, :dependent => :destroy
  has_many :users, :through => :comment_users
  ...
end

然而删除评论并不会导致相关的comment_user记录被删除。

那么,在使用:through时,推荐的级联删除方法是什么呢?

谢谢

3个回答

103

显然,:dependent 属性没有被忽略!

真正的问题在于我调用了 Comment.delete(id),它直接访问数据库。现在我使用 Comment.destroy(id), 它会加载 Comment 对象并在其上调用 destroy() 方法。这会触发 :dependent => :destroy,一切都好了。


确实!我遇到了类似的问题,只不过我即使使用了 dependent: :destroy 也仍然出现了外键错误。问题在于我使用了 obj.delete 而不是 obj.destroy,因此依赖项没有被删除,从而导致完整性错误。 - Tim Fletcher

12

楼主的解决方案是有效的,但我想指出的是,这仅适用于该表具有id列的情况。我更喜欢我的多对多表只有两个外键,但我必须从迁移表定义中删除“id:false”,以使级联删除起作用。拥有这个功能绝对比在表上没有id列更重要。


谢谢!我刚花了半天时间自己试图解决这个问题。 - Tintin81

8
如果您有一个多态关联,您应该像@blogofsongs所说的那样,但是要使用一个类似于foreign_key 属性的东西:
class User < ActiveRecord::Base
  has_many :activities , dependent: :destroy, foreign_key: :trackable_id
end

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