2012-07-19 23 views
3

考慮這個片段中,距離著名的敏捷Web開發與鋼軌書(最新版):這個rails 3 .build方法到底在做什麼?

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),但如果購物車中沒有line_itemscart.line_items如何工作?

回答

2

Cart模型中,最有可能與has_many關聯的LineItem模型稱爲line_items。 Rails會自動使用空數組初始化該關聯。

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

每次添加通話@cart.line_items.build,認爲它是這樣的::

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

注:這絕對不是如何實際的代碼

你能想到的@cart爲被初始化作品,但你可以把功能行爲看成是一樣的。

1

@ cart.line_items有時可能表現得像一個數組,但它有actually an object以及更多包含關係信息的功能。所以當你打電話給@cart.line_items.build時,實際上你發送了一條消息build給一個類型爲(我認爲)的對象ActiveRecord :: Relation,然後在你的line_item的內存中建立一個對象並且已經設置了cart_id。