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

How to validate existence of parent id in child model in Rails for nested attributes

这里有 2 个模型。 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_item 模型中验证 order_id 的存在?对于 nested_attributes,order_item 中的 order_id 已经强制存在。然而,当 order_item 单独保存时(不与 order 一起保存),我们仍然需要验证 order_id.

如果我做对了,你在保存与你的设置相关的记录时遇到了问题:

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

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

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

有关使用 inverse_of 选项与关联的更多信息,请阅读 here

这个:

validates :order_id, :presence => true

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

validates :order, :presence => true

这将确保已提交 order_idorder 存在。