ActiveRecord构建或创建方法,需要将父对象作为参数传递

时间:2013-04-02 12:55:33

标签: ruby-on-rails-3 activerecord rails-activerecord

据我所知,模型中子对象的构建/创建方法会自动创建关系。

但是,当我在父对象和子对象上都使用validates时,我无法保存父对象,除非我在子构建/创建方法中显式传入父对象

父类

class Order < ActiveRecord::Base
  attr_accessible :tax, :total
  has_many :order_lines

  validates :user, presence: true
  validates :order_lines , presence: true
end

儿童班

class OrderLine < ActiveRecord::Base
  attr_accessible :order, :product, :qty
  belongs_to :order
  belongs_to :product
  ...
  ...
  validates :order, presence: true
end

问题

如果我尝试:

,我会收到错误
order.order_lines.build(product: product)
order.save => #error for order_lines, order can't be blank

#or
order.order_lines.create(product: product) => # throws same error

但我可以成功完成以下任务:

order.order_lines.build(product: product, order: order)
order.save => #true

#or
order.order_lines.create(product: product, order: order) => #true

这导致我对FactoryGirl和创建测试的进一步问题。

我是否错误并误解您必须明确传入父对象?

Rails vs:3.2.11

AR API documenation

1 个答案:

答案 0 :(得分:0)

轨道中的关联应该让你的生活更轻松,而不是相反。

这样的事情怎么样?

Order has_many Lines has_one Product

这种架构对我来说更有意义。现在你可以这样做:

order.lines.product.build(attributes)