使用rails book(最新版本)从着名的敏捷Web开发中获取此片段:
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)
基本上如果line_item
同时属于产品和购物车,我会分别创建这些关系。
此外,如果购物车还没有line_items
,那我该怎么做@cart.line_items
?我了解line_items.build(product: product)
会向我返回一个line_item
对象(我保存到@line_item
),但如果购物车中没有cart.line_items
,line_items
如何工作?然而?
答案 0 :(得分:2)
在Cart
模型中,has_many
模型与LineItem
模型之间很可能存在line_items
关联。 Rails会自动使用空数组初始化该关联。
您可以将@cart
初始化为:
@cart = Cart.new
@cart.line_items = []
每次添加致电@cart.line_items.build
时,请将其视为:
new_line_item = LineItem.new cart: @cart
@cart.line_items.push new_line_item
注意:这绝对不是实际代码的工作方式,但您可以将功能行为视为相同。
答案 1 :(得分:1)
@ cart.line_items有时可能表现得像一个数组,但actually an object具有更多包含关系信息的功能。因此,当您调用@cart.line_items.build
时,实际上是向类型(我认为)ActiveRecord :: Relation的对象发送消息build
,然后在已设置cart_id的line_item的内存中构建对象。 / p>