2

注意:这个问题是由我关于使用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先 save 然后 build b,但我的情况比这个例子复杂一点(参见我上面提到的问题),如果可能的话,我宁愿避免这种情况。

4

2 回答 2

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
于 2012-08-02T17:15:00.560 回答
0

您可以使用回调来创建对象(也许 before_save?)。见这里

于 2012-08-02T17:11:17.953 回答