2013-04-02 46 views
0

這是我的理解是模型中的子對象的構建/創建方法會自動創建關係。ActiveRecord構建或創建需要傳遞父對象作爲參數的方法

不過,雖然我對兩者都使用validates父和子對象,我無法保存父對象,除非我明確地傳遞在孩子構建父對象/ create方法

父類

class Order < ActiveRecord::Base 
    attr_accessible :tax, :total 
    has_many :order_lines 

    validates :user, presence: true 
    validates :order_lines , presence: true 
end 

子類

class OrderLine < ActiveRecord::Base 
    attr_accessible :order, :product, :qty 
    belongs_to :order 
    belongs_to :product 
    ... 
    ... 
    validates :order, presence: true 
end 

問題

所以我得到的錯誤,如果我嘗試:

order.order_lines.build(product: product) 
order.save => #error for order_lines, order can't be blank 

#or 
order.order_lines.create(product: product) => # throws same error 

但我可以做成功如下:

order.order_lines.build(product: product, order: order) 
order.save => #true 

#or 
order.order_lines.create(product: product, order: order) => #true 

這使我FactoryGirl和創建測試進一步的問題。

我錯了,誤解你必須顯式傳遞父對象?

的Rails VS:3.2.11

AR API documenation

回答

0

在軌的關聯是爲了使您的生活更輕鬆,而不是相反。

這樣的事情呢?

Order has_many Lines has_one Product 

這個架構對我更有意義。現在你可以做這樣的事情:

order.lines.product.build(attributes) 
+0

感謝dr4ke,但是這並沒有解決我是否不應該不必使用create/build方法傳遞父對象。此外,您的建議會打破訂單行只能有一個產品關聯的域邏輯。 – pghtech

+0

抱歉,錯字。你這樣做,你的模型協會應該適當地構建,相應地驗證並且容易地測試。也許我錯過了這一點? – jbearden

相關問題