【问题标题】:Rails HABTM - Properly removing an associationRails HABTM - 正确删除关联
【发布时间】:2014-01-22 09:31:16
【问题描述】:

我正在为购物网站开发一项用于创建特价商品的功能。一种产品可以有不止一种特价商品,很明显一种特价商品可以有不止一种商品。

我使用的是has_and_belongs_to_many 关系,所以我声明:

产品.rb

has_and_belongs_to_many :specials

特殊.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

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

【问题讨论】:

  • 顺便问一下,为什么反引号不能把单词变成代码?抱歉,这是我在 Stackoverflow 上的第一篇文章
  • backticks 仅适用于字符串 - 如果您有代码块,则应缩进 4 个空格
  • 我认为它确实删除了两种方式的关联,您是否尝试过重新加载@special
  • xlembouras 是正确的。 @special.products.delete(@product) 实际上确实删除了双方的关联,因为它删除了连接表中的记录(即product_specials)。尝试@product.reload.specials 或告诉.specials 通过传递true 重新获取连接表记录,就像@product.specials(true) 一样。见here
  • 您也可以在第一行之前使用三个反引号,在最后一行使用三个反引号。如果你想强制颜色编码,你可以在前三个反引号之后写,就像'''ruby \n def myCode end \n '''

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


【解决方案1】:

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

【讨论】:

  • 应该提到在has_and_belongs_to_many 上调用delete 将通过从连接表中删除行来自动将删除提交到数据库。
猜你喜欢
  • 1970-01-01
  • 2011-04-29
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多