テストを何度も繰り返した結果、2 つのモデル間の HABTM 関係を表す結合テーブルが、これらのモデルのインスタンスが削除されたときにエントリを削除していないことに気付きました。HABTM 関係を持つモデルのインスタンスを削除する場合、何か特別なことをする必要がありますか?
3205 次
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 に答える