为什么ActiveRecord会自动验证has_many关联

时间:2013-03-28 11:03:15

标签: ruby-on-rails ruby-on-rails-3 validation activerecord

给出以下模型:

class Question < ActiveRecord::Base
  has_many  :answers
end

class Answers < ActiveRecord::Base
  belongs_to: question
  validates :comment, presence: true
end

致电

question = Question.new
question.answers.build
question.valid?

valid?会返回false,因为相关答案无效。写作时

has_many :answers, validate: false
Question valid?中的

会返回true

这是一个错误还是在使用has_many时需要自动验证相关模型? Rails指南明确解释validate_associatedhas_many关系的使用:http://guides.rubyonrails.org/active_record_validations_callbacks.html#validates_associated

2 个答案:

答案 0 :(得分:6)

绝对是一个错误。

  • 您已创建Question
  • 您已告诉Rails附加Answer的新实例并将其与此新Question
  • 相关联
  • 然后你问“Rails,我创建的这个Question/Answer模型和关联是否已准备好保存到数据库中?”

正如您所发现的,Rails会在您的案例中说“No”

我从未使用过,也不关心validates_associated。但是,我可以向您指出文档,解释您为什么会看到自己的行为。

虽然上述源文件中的文档值得一读,但我会为你提取这些内容

  

请注意:autosave =&gt; false与不声明不同:自动保存。     当:自动保存选项不存在时,将保存新的关联。

  • 您尚未在:autosave => SOMETHING协会
  • 上指定:answers
  • 因此,默认情况下,Rails会尝试在您的新Answer
  • 上保存新版本/关联的Question
  • 由于Answer无效
  • ,保存将失败

答案 1 :(得分:0)

我已在父模型中覆盖valid?以处理验证,同时注意其嵌套关联的状态:

def valid?(context=nil)
  super(context) && self.answers.map(&:valid?).all?
end