web-dev-qa-db-fra.com

Rails HABTM - Supprimer correctement une association

Je développe une fonctionnalité pour créer des offres spéciales, pour un site de shopping. Un produit peut avoir plus d'un spécial, et évidemment un spécial peut avoir plus d'un produit.

J'utilise un has_and_belongs_to_many relation, j'ai donc déclaré:

Product.rb

has_and_belongs_to_many :specials

Special.rb

has_and belongs_to_many :products

Maintenant, avec un produit @product et une spéciale @special, une association est créée comme ça ..

@special.products << @product

Après cela, ce qui suit est vrai:

@special.products.first == @product

et, surtout:

@product.specials.first == @special

Lorsque je supprime l'association en utilisant ce

@special.products.delete(@product)

puis @product est supprimé des offres spéciales, donc @special.products.first==nil, pourtant @productcontient toujours@special, en d'autres termes @products.specials.first==@special

Existe-t-il un moyen approprié, en plus d'écrire une méthode de suppression, de le faire en un seul appel?

31
Marco Prins

Selon la documentation Rails:

collection.delete (objet,…)

Supprime un ou plusieurs objets de la collection en supprimant leurs associations de la table de jointure. Cela ne détruit pas les objets.

Référence brillante ici pour vous

Vous pouvez utiliser:

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

product.specials.delete(special)

Cela crée des objets ActiveRecord pour l'objet que vous essayez de supprimer, ce qui donne une définition claire de la fonction

collection.clear

Supprime tous les objets de la collection en supprimant leurs associations de la table de jointure. Cela ne détruit pas les objets.

Dans cet exemple:

product = Product.find(x)

product.specials.clear
58
Richard Peck