Rails HABTM - 正确删除关联

时间:2014-01-22 09:31:17

标签: ruby-on-rails ruby-on-rails-3 has-and-belongs-to-many

我正在开发一个用于为购物网站创建特价的功能。一种产品可以有多种特殊产品,显然特殊产品可以有多种产品。

我正在使用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

除了编写删除方法之外,还有什么方法可以在一次调用中执行此操作吗?

1 个答案:

答案 0 :(得分:56)

According to the Rails documentation:

  

collection.delete(object,...)

     

从中删除一个或多个对象   通过从连接表中删除它们的关联来进行收集。这个   不破坏物体。

Brilliant reference here for you

您可以使用:

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

product.specials.delete(special)

这会为您要删除的对象创建ActiveRecord对象,从而为函数提供明确的定义

  

<强> collection.clear

     

从中删除所有对象   通过从连接表中删除它们的关联来进行收集。这个   不破坏物体。

在这个例子中:

product = Product.find(x)

product.specials.clear