如何使关联在构建和未保存的对象中工作?

时间:2013-11-11 11:58:46

标签: ruby-on-rails activerecord

让我说我有类似的东西:

@order = Order.new(status: :pending)

@item  = @order.items.build(title: "Shirt")

当我尝试调用@item.order时,我发现找不到错误,我想这是因为它仍未保存到数据库中,但如何在不保存任何对象的情况下指向构建的对象? / p>

@item.order # Not Found - Tries to fetch from the DB

3 个答案:

答案 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功能将一些相关记录保存在一起。

相关问题