让我说我有类似的东西:
@order = Order.new(status: :pending)
@item = @order.items.build(title: "Shirt")
当我尝试调用@item.order
时,我发现找不到错误,我想这是因为它仍未保存到数据库中,但如何在不保存任何对象的情况下指向构建的对象? / p>
@item.order # Not Found - Tries to fetch from the DB
答案 0 :(得分:6)
要完成这项工作,您必须告诉您项目模型的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)
答案 1 :(得分:3)
我在Rails 4.0.1中对此进行了测试,看起来不再需要使用inverse_of
,因为正确推断了关联。在此提交中解决了这个问题:https://github.com/rails/rails/pull/9522
值得注意的是,目前仍然没有has_many through:
关系的解决方案。
答案 2 :(得分:0)
那是因为@order
还没有ID。因此,在调用@order.items.build
时,该项目在nil
字段中有order_id
,因此无法找到您想要的订单。
我建议您使用nested attributes功能将一些相关记录保存在一起。