如果对子项的验证失败,ActiveRecord仍会保存父对象

时间:2011-03-30 16:29:32

标签: ruby-on-rails validation activerecord

使用以下关系设置:

class Parent < ActiveRecord::Base
  has_many :children
end

class Child < ActiveRecord::Base
  belongs_to :parent
  validates_presence_of :first_name
end

p = Parent.new
p.children.build

p.save
=> false

p.errors
=> {:children => ["is invalid"]}

有没有办法在子对象上保留验证,但没有让失败的验证阻止父对象的保存?

2 个答案:

答案 0 :(得分:2)

查看save(options={})中的ActiveRecord::Validations

您可以将:validate => false传递给save(),这会跳过对valid?的调用。

这也会跳过对父对象的任何验证,因此如果父对象也有验证,你可能需要做更多的事情。

Source

答案 1 :(得分:0)

这不是铁杆式,但它可以回答你的问题。所以只需自己管理协会:

p = Parent.new
p.save
c = Children.new(:parent_id => p.id)
c.save => 'first name can't be blank"