I am developing a feature for creating specials, for a shopping website. One product can have more than one special, and obviously a special can have more than one product..
I am using a has_and_belongs_to_many
relationship, so i have declared:
Product.rb
has_and_belongs_to_many :specials
Special.rb
has_and belongs_to_many :products
Now, with a product @product
and a special @special
, an association is created like so..
@special.products << @product
After doing this, the following is true:
@special.products.first == @product
and, importantly:
@product.specials.first == @special
When i delete the association using this
@special.products.delete(@product)
then @product
is removed from specials, so @special.products.first==nil
, however @product
still contains @special
, in other words @products.specials.first==@special
Is there any proper way, apart from writing a delete method, to do this in a single call?
According to the Rails documentation:
collection.delete(object, …)
Removes one or more objects from the collection by removing their associations from the join table. This does not destroy the objects.
Brilliant reference here for you
You can use:
product = Product.find(x)
special = product.specials.find(y)
product.specials.delete(special)
This creates ActiveRecord objects for both the object you're trying to remove, which gives clear definition to the function
collection.clear
Removes all objects from the collection by removing their associations from the join table. This does not destroy the objects.
In this example:
product = Product.find(x)
product.specials.clear