Rails HABTM - правильное удаление ассоциации

Я разрабатываю функцию для создания специальных продуктов для веб-сайта для покупок. Один продукт может иметь более одного специального, и, очевидно, специальный может иметь более одного продукта.

Я использую связь 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, другими словами @[email protected]

Есть ли какой-либо правильный способ, помимо написания метода удаления, сделать это за один вызов?

Ответ 1

Согласно документации Rails:

collection.delete (объект,...)

Удаляет один или несколько объектов из коллекции, удаляя их связи из таблицы соединений. Это не разрушает объекты.

Блестящая ссылка здесь для вас

Ты можешь использовать:

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

product.specials.delete(special)

Это создает объекты ActiveRecord для обоих объектов, которые вы пытаетесь удалить, что дает четкое определение функции

collection.clear

Удаляет все объекты из коллекции, удаляя их связи из таблицы соединений. Это не разрушает объекты.

В этом примере:

product = Product.find(x)

product.specials.clear