如何在 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_id
的 order
存在。
这里有 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_id
的 order
存在。