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


假设我有类似的东西:

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

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

当我试着打电话的时候 @item.order,我得到一个未找到的错误,我想这是因为它仍未保存到数据库,但是如何使它指向构建的对象而不保存任何对象?

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

3786
2017-11-11 11:58


起源



答案:


为了完成这项工作,你必须告诉你 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)

6
2017-11-11 12:18



谢谢丹尼尔,有没有其他方式没有触摸模型本身?所以我只在我想要的时候申请这个? - Ryan


答案:


为了完成这项工作,你必须告诉你 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)

6
2017-11-11 12:18



谢谢丹尼尔,有没有其他方式没有触摸模型本身?所以我只在我想要的时候申请这个? - Ryan


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

值得注意的是,仍然没有解决方案 has_many through: 这个时候的关系。


3
2017-11-27 20:35



仍然没有解决方案 has_many through:?我只是偶然发现它,无法相信。 - Markus
你可以使用关联回调并自己处理内存中的关联,这是我现在知道的唯一方法。 - Graham Conzett


那是因为 @order 还没有ID。所以在打电话时 @order.items.build 该项目有一个 nil 在 order_id 因此无法找到您想要的订单。

我建议你用 嵌套属性 功能将一些相关记录保存在一起。


0
2017-11-11 12:14