どのように私はHABTMからエントリを削除することができ、レールにテーブルを結合しますか?

StackOverflow https://stackoverflow.com/questions/1915229

質問

テストの多くの繰り返しを通して、私はこれらのモデルのインスタンスが削除されますときに、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オプションを追加することができます。参加の反対側にあるオブジェクトを削除すると、デフォルトの動作ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top