Rails是否允许对validates_associated进行条件验证?

时间:2015-02-24 19:39:20

标签: ruby-on-rails rails-activerecord

Rails是否允许对validates_associated进行条件验证?我在Rails 4.2.0上看到以下内容。我试图做错吗?

型号:

class User < ActiveRecord::Base
  has_many :books

  validates_associated :books, if: :should_validate_book?

  def should_validate_book?
    return false
  end
end

class Book < ActiveRecord::Base
  belongs_to :user

  validates_presence_of :title
end

Book的title属性的状态验证仍在运行(Rails控制台):

> u = User.create!
 => #<User id: 2, created_at: "2015-02-24 19:34:51", updated_at: "2015-02-24 19:34:51">
> u.books.build
 => #<Book id: nil, user_id: 3, title: nil, created_at: nil, updated_at: nil>
> u.valid?
 => false
> u.books.first.errors
 => #<ActiveModel::Errors:0x007fa256b210d8 @base=#<Book id: nil, user_id: 3, title: nil, created_at: nil, updated_at: nil>, @messages={:title=>["can't be blank"]}>

2 个答案:

答案 0 :(得分:2)

事实证明,has_many关系默认为validates_associated为ON。要有条件地进行修改,您需要在has_many声明中添加validate:false:

  has_many :books, validate: false

答案 1 :(得分:0)

在Rails中,自远古以来validates_associated只采用了a list个属性。除此之外,你有点混淆你的模型之间的行为,从你收集的标准到你粘贴的标准。更好的方法是调整Book模型中的验证以考虑变化,让Book自行决定是否应验证对象。