3

摘自著名的敏捷 Web 开发与 Rails 书(最新版)中的片段:

def create 

  @cart = current_cart 

  product = Product.find(params[:product_id])

  @line_item = @cart.line_items.build(product: product)

这适用于一般的电子商务/仓库应用程序,此功能适用于特定产品的“添加到购物车”按钮。这是我感到困惑的地方:

我想象的代码是:

@line_item = line_items.build(product: product) 

@line_item = line_items.build(cart: @cart) 

基本上,如果 aline_item既属于产品又属于购物车,我会分别创建这些关系。

另外,如果购物车还line_items没有,那我该怎么办@cart.line_items?我知道line_items.build(product: product)将返回给我一个line_item对象(我保存到@line_item),但是如果购物车中还没有对象,如何cart.line_items工作line_items

4

2 回答 2

2

Cart模型中,很可能has_manyLineItem名为 的模型有关联line_items。Rails 将自动使用空数组初始化该关联。

你可以认为@cart被初始化为:

@cart = Cart.new
@cart.line_items = []

每次添加 call@cart.line_items.build时,都可以这样想:

new_line_item = LineItem.new cart: @cart
@cart.line_items.push new_line_item

注意:这绝对不是实际代码的工作方式,但您可以将功能行为视为相同。

于 2012-07-19T05:03:29.013 回答
1

@cart.line_items 有时可能表现得像一个数组,但它实际上是一个包含关系信息的具有更多功能的对象。因此,当您打电话时,@cart.line_items.build您实际上是在向(我认为)ActiveRecord::Relation 类型的对象发送消息build,然后该对象在您的 line_item 的内存中构建一个对象,并且已经设置了 cart_id。

于 2012-07-19T14:55:41.450 回答