6

テストを何度も繰り返した結果、2 つのモデル間の 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 に答える