どのように私はHABTMからエントリを削除することができ、レールにテーブルを結合しますか?
質問
テストの多くの繰り返しを通して、私はこれらのモデルのインスタンスが削除されますときに、2つのモデル間のHABTM関係を表して、私の参加テーブルはエントリを削除されていないことに気づきました。 HABTM関係を持っているモデルのインスタンスを削除するとき、私は特別な何かをする必要がありますか?
解決
精密検査のHABTMの関係には、テーブルのエントリを削除するに参加する必要があります。しかし、この解決策のどちらもHABTM関係や私は、元のバージョンで記述される関係は、(ポスト履歴を参照してください)あなたはdelete
メソッドを持つレコードを排除する場合、それらは、テーブルのエントリに参加し削除します。 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? }
他のヒント
結合テーブルのエントリは、あなたが特別な何もせずに削除取得する必要があります。あなたは奇妙な状況がある場合は、動作を変更するために、あなたのコードに:delete_sql
オプションを追加することができます。参加の反対側にあるオブジェクトを削除すると、デフォルトの動作ではありません。
所属していません StackOverflow