在Rails中,是否有一种与父母同时创建子对象的简单方法?

时间:2012-08-02 17:05:01

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

  

注意:此问题是由another question产生的,因为我使用了accepts_nested_attributes_for。如果需要,您可以参考该问题以获得更多背景信息。

我相信这个问题最好用一个简单的例子来解释:

class Foo < ActiveRecord::Base
  has_many :bars, inverse_of: :foo
end

class Bar < ActiveRecord::Base
  validates :foo_id, presence: true

  belongs_to :foo, inverse_of: :bars
end

f = Foo.new()
=> #<Foo id: nil, created_at: nil, updated_at: nil>
b = f.bars.build()
=> #<Bar id: nil, foo_id: nil, created_at: nil, updated_at: nil>
f.save!
=> ActiveRecord::RecordInvalid: Validation failed: Bars foo can't be blank

有没有简单的方法来解决这个问题?我知道我可以先保存f,然后再构建b,但我的情况比这个例子稍微复杂一点(请参阅上面提到的问题),如果可能,我宁愿避免这种情况

2 个答案:

答案 0 :(得分:2)

子记录与父记录同时创建,这就是您的验证失败,您的孩子尚未持久化的原因。为了使它工作,我会写一个像这样的自定义验证

class Foo < ActiveRecord::Base
  has_many :bars
  accepts_nested_attributes_for :bars, :allow_destroy => true

end

class Bar < ActiveRecord::Base
  belongs_to :foo
  validates_presence_of :bar
end

答案 1 :(得分:0)

您可以使用回调来创建对象(也许是before_save?)。请参阅here