这个rails 3 .build方法究竟做了什么?

时间:2012-07-19 04:10:50

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

使用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_itemsline_items如何工作?然而?

2 个答案:

答案 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>