6

通过多次测试迭代,我刚刚注意到,当这些模型的实例被删除时,表示两个模型之间的 HABTM 关系的连接表并没有删除条目。删除具有 HABTM 关系的模型实例时,我是否需要做一些特别的事情?

4

2 回答 2

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? }
于 2009-12-16T15:17:22.180 回答
0

连接表中的条目应该被删除,而无需您做任何特别的事情。:delete_sql如果您遇到奇怪的情况,可以将选项添加到代码中以更改行为。删除连接另一侧的对象不是默认行为。

于 2009-12-16T21:25:49.373 回答