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

Rya*_*yan 11 activerecord ruby-on-rails

假设我有类似的东西:

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

@item  = @order.items.build(title: "Shirt")
Run Code Online (Sandbox Code Playgroud)

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

@item.order # Not Found - Tries to fetch from the DB
Run Code Online (Sandbox Code Playgroud)

Dan*_*ski 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
Run Code Online (Sandbox Code Playgroud)

这样,即使在保存到数据库之前,您的关联也将正确设置.

编辑:如果您不想这样,您可以始终明确指定关联:

@item = @order.items.build(title: "Shirt")
@item.order = @order
Run Code Online (Sandbox Code Playgroud)

或者在一行中:

@item = @order.items.build(title: "Shirt", order: @order)
Run Code Online (Sandbox Code Playgroud)