如何在Rails中验证嵌套属性中子模型中父ID的存在性

时间:2015-09-27 15:00:25

标签: ruby-on-rails nested-attributes

这是2个型号。 button = Gtk.Button.new_with_mnemonic("_Open") 获取Order的嵌套属性。

order_items

如何验证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的存在?使用nested_attributes,order_itemorder_id的存在已经强制执行。但是,如果单独保存order_item(而不是order_item),我们仍需要验证order

2 个答案:

答案 0 :(得分:3)

如果我做对了,你就无法通过设置保存相关记录:

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

要修复它,您需要使用inverse_of选项明确告诉Rails关于关联:

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

在您的情况下不是必需的,但您也可以在inverse_of中添加OrderItem

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

有关将inverse_of选项与关联一起使用的详情,请参阅here

答案 1 :(得分:2)

此:

validates :order_id, :presence => true

只会确保提交order_id的某些值。你想要这个:

validates :order, :presence => true

这将确保提交order的{​​{1}}存在。