假设我有类似的东西:
@order = Order.new(status: :pending)
@item = @order.items.build(title: "Shirt")
当我试着打电话的时候 @item.order
,我得到一个未找到的错误,我想这是因为它仍未保存到数据库,但是如何使它指向构建的对象而不保存任何对象?
@item.order # Not Found - Tries to fetch from the DB
假设我有类似的东西:
@order = Order.new(status: :pending)
@item = @order.items.build(title: "Shirt")
当我试着打电话的时候 @item.order
,我得到一个未找到的错误,我想这是因为它仍未保存到数据库,但是如何使它指向构建的对象而不保存任何对象?
@item.order # Not Found - Tries to fetch from the DB
为了完成这项工作,你必须告诉你 order
您的项目模型的关联它是 逆 你的 items
协会或您订购模型,反之亦然:
喜欢这个:
class Item < ActiveRecord::Base
belongs_to :order, inverse_of: :items
end
class Order < ActiveRecord::Base
has_many :items, inverse_of: :order
end
这样,即使在保存到数据库之前,您的关联也将正确设置。
编辑: 如果您不想这样,您可以始终明确指定关联:
@item = @order.items.build(title: "Shirt")
@item.order = @order
或者在一行中:
@item = @order.items.build(title: "Shirt", order: @order)
为了完成这项工作,你必须告诉你 order
您的项目模型的关联它是 逆 你的 items
协会或您订购模型,反之亦然:
喜欢这个:
class Item < ActiveRecord::Base
belongs_to :order, inverse_of: :items
end
class Order < ActiveRecord::Base
has_many :items, inverse_of: :order
end
这样,即使在保存到数据库之前,您的关联也将正确设置。
编辑: 如果您不想这样,您可以始终明确指定关联:
@item = @order.items.build(title: "Shirt")
@item.order = @order
或者在一行中:
@item = @order.items.build(title: "Shirt", order: @order)
我在Rails 4.0.1中进行了测试,它看起来像是在使用 inverse_of
不再需要,因为正确推断了关联。它在此提交中得到了解决: https://github.com/rails/rails/pull/9522
值得注意的是,仍然没有解决方案 has_many through:
这个时候的关系。
那是因为 @order
还没有ID。所以在打电话时 @order.items.build
该项目有一个 nil
在 order_id
因此无法找到您想要的订单。
我建议你用 嵌套属性 功能将一些相关记录保存在一起。