通过多次迭代测试,我发现我的连接表代表了两个模型之间的HABTM关系,并不会删除这些模型的实例被删除时的条目。在删除具有HABTM关系的模型实例时,是否需要执行一些特殊操作?
答案 0 :(得分: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? }
答案 1 :(得分:0)
连接表中的条目应该在没有做任何特殊操作的情况下被删除。如果您遇到奇怪的情况,可以在代码中添加:delete_sql
选项以更改行为。删除连接另一侧的对象不是默认行为。