注意:此问题是由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
,但我的情况比这个例子稍微复杂一点(请参阅上面提到的问题),如果可能,我宁愿避免这种情况
答案 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。