2015-09-27 76 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没有“订单”来验证。 –