如何从rails中的HABTM连接表中删除条目?

时间:2009-12-16 15:08:04

标签: mysql ruby-on-rails has-and-belongs-to-many relationships dependent-destroy

通过多次迭代测试,我发现我的连接表代表了两个模型之间的HABTM关系,并不会删除这些模型的实例被删除时的条目。在删除具有HABTM关系的模型实例时,是否需要执行一些特殊操作?

2 个答案:

答案 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选项以更改行为。删除连接另一侧的对象不是默认行为。