11

假设我有类似的东西:

@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
4

3 回答 3

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)
于 2013-11-11T12:18:16.223 回答
3

我在 Rails 4.0.1 中对此进行了测试,看起来inverse_of不再需要使用,因为关联被正确推断。它在这个提交中得到解决:https ://github.com/rails/rails/pull/9522

值得注意的是,目前还没有解决has_many through:关系的办法。

于 2013-11-27T20:35:47.807 回答
0

那是因为@order还没有身份证。因此,当调用@order.items.build该项目时,该项目有一个nil输入order_id字段,因此无法找到您想要的订单。

我建议您使用嵌套属性功能将一些关联的记录保存在一起。

于 2013-11-11T12:14:05.347 回答