4

通过很多迭代测试,我只注意到,表示两个模型之间的HABTM关系的连接表在删除这些模型的实例时不会删除条目。删除具有HABTM关系的模型的实例时,是否需要做一些特殊的事情?如何从rails的HABTM连接表中删除条目?

回答

7

进一步检查后,HABTM关系应该删除连接表条目。然而,当您使用delete方法消除记录时,HABTM关系或我在此解决方案的原始版本中描述的关系(请参阅发布历史记录)都不会删除这些连接表条目。 ActiveRecord::Base#delete不会触发任何回调,例如HABTM关系建立的删除连接表中的孤立条目的回调。相反,你应该使用ActiveRecord::Base#destroy。您将不得不使用原始SQL删除不需要的条目。如果你决定创建一个连接模型,你可以迭代连接模型中的条目,删除那些没有关联的条目。

例子:

class Foo < ActiveRecord::Base 
    has_many :foo_bars, :dependent => :destroy 
    has_many :bars, :through => :foo_bars 
end 

class FooBar < ActiveRecord::Base 
    belongs_to :foo 
    belongs_to :bar 
end 

class Bar < ActiveRecord::Base 
    has_many :foo_bars, :dependent => :destroy 
    has_many :foos, :through => :foo_bars 
end 

FooBar.all.each{|fb| fb.destroy? if fb.foo.nil? || fb.bar.nil? } 
+0

因此,如果我必须“FooBar.all.each {| fb | fb.destroy?if fb.foo.nil?|| fb.bar.nil?}有一点指向”dependent =>:destroy“ “ 无论如何? – James 2009-12-17 07:28:22

+0

做的“依赖=>:摧毁”甚至做任何事情?它似乎并不如此。我需要执行销毁还是其他? – James 2009-12-17 07:29:15

+1

'FooBar.all.each {...}'只是为了摆脱连接表中的孤立记录。在移动到has \ _many之后:尽管与连接模型关联的关系标记为:dependent =>:destroy,但如果删除它们所属的记录,则不会在连接表中孤立记录。添加:依赖=>:销毁选项将销毁所有与你正在销毁的相关记录。但是,它不会触发删除。你应该阅读关于ActiveRecord :: Base#destroy,ActiveRecord :: Base#delete和ActiveRecord :: Associations :: ClassMethods的文档。 – EmFi 2009-12-17 07:55:38

0

在连接表中的条目应该得到没有你做什么特别的删除。如果您有奇怪的情况,您可以将:delete_sql选项添加到您的代码中以更改行为。删除连接另一端的对象不是默认行为。