ショッピング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
削除メソッドを書く以外に、これを単一の呼び出しで行う適切な方法はありますか?
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