2015-09-27 73 views
1

以下是2個模型。 Order需要order_items的嵌套屬性。如何在子模型中驗證Rails嵌套屬性中parent id的存在

class order 
    has_many order_items 
    accept_nested_attributes_for :order_items 
end 

class order_item 
    belongs_to :order 
    validates :order_id, :presence => true #this line cause spec failure. 
end 

如何驗證的order_id存在於order_item模式?使用nested_attributes,order_itemorder_id的存在已被執行。但是,當自行保存order_item(不是與order一起)時,我們仍然需要驗證order_id

+0

你究竟想達到什麼目的?你能向我們展示導致你的問題的創建/新電話嗎? – panmari

回答

3

如果我得到它的權利,你有麻煩保存您的設置相關的記錄:

params = {number: 'order-123', order_items_attributes:{product_id:1, quantity: 2, price: 3}} 
Order.create params # => this should not work 

爲了解決這個問題,你需要明確地告訴Rails有關協會,使用inverse_of選項:

class Order 
    # without inverse_of option validation on OrderItem 
    # is run before this association is created 
    has_many :order_items, inverse_of: :order 
    accepts_nested_attributes_for :order_items 
end 

您的情況並非必需,但您也可以在OrderItem中添加inverse_of

class OrderItem 
    belongs_to :order, inverse_of: :order_items 
    # ... the rest 
end 

關於使用inverse_of選項與關聯的更多信息可以閱讀here

2

此:

validates :order_id, :presence => true 

只能確保爲order_id一些價值被提交。你想這樣的:

validates :order, :presence => true 

這將確保與所提交的order_idorder存在。

+1

這仍然不允許在關聯上進行正確的驗證。在創建操作中,訂單沒有ID,因此order_item沒有「訂單」來驗證。 –