假设我有类似的东西:
@order = Order.new(status: :pending)
@item = @order.items.build(title: "Shirt")
当我尝试调用@item.order
时,我得到一个错误 not found,我猜这是因为它仍然没有保存到数据库中,但是如何让它指向构建的对象而不保存任何对象呢?
@item.order # Not Found - Tries to fetch from the DB
假设我有类似的东西:
@order = Order.new(status: :pending)
@item = @order.items.build(title: "Shirt")
当我尝试调用@item.order
时,我得到一个错误 not found,我猜这是因为它仍然没有保存到数据库中,但是如何让它指向构建的对象而不保存任何对象呢?
@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)
我在 Rails 4.0.1 中对此进行了测试,看起来inverse_of
不再需要使用,因为关联被正确推断。它在这个提交中得到解决:https ://github.com/rails/rails/pull/9522
值得注意的是,目前还没有解决has_many through:
关系的办法。
那是因为@order
还没有身份证。因此,当调用@order.items.build
该项目时,该项目有一个nil
输入order_id
字段,因此无法找到您想要的订单。
我建议您使用嵌套属性功能将一些关联的记录保存在一起。