web-dev-qa-db-ja.com

Rails HABTM-関連付けを適切に削除する

ショッピングWebサイトのスペシャルを作成する機能を開発しています。 1つの製品に複数のスペシャルを含めることができます。明らかに、スペシャルには複数のプロダクトを含めることができます。

私はhas_and_belongs_to_many関係を使用しているので、宣言しました:

Product.rb

has_and_belongs_to_many :specials

Special.rb

has_and belongs_to_many :products

現在、製品@productと特別な@specialを使用して、そのように関連付けが作成されます。

@special.products << @product

これを行った後、次のことが当てはまります。

@special.products.first == @product

そして、重要なことは:

@product.specials.first == @special

これを使用して関連付けを削除すると

@special.products.delete(@product)

@productはスペシャルから削除されるため、@special.products.first==nilですが、@productまだ含まれています@special、つまり@products.specials.first==@special

削除メソッドを書く以外に、これを単一の呼び出しで行う適切な方法はありますか?

31
Marco Prins

Rails documentation:

collection.delete(object、…)

結合テーブルから関連付けを削除することにより、コレクションから1つ以上のオブジェクトを削除します。これはオブジェクトを破壊しません。

あなたのための素晴らしいリファレンスはこちら

次を使用できます。

product = Product.find(x)
special = product.specials.find(y)

product.specials.delete(special)

これにより、削除しようとしている両方のオブジェクトのActiveRecordオブジェクトが作成され、関数に明確な定義が与えられます

collection.clear

結合テーブルから関連付けを削除することにより、コレクションからすべてのオブジェクトを削除します。これはオブジェクトを破壊しません。

この例では:

product = Product.find(x)

product.specials.clear
58
Richard Peck