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

dan*_*dan 5 validation activerecord ruby-on-rails ruby-on-rails-3

以下模型给出:

class Question < ActiveRecord::Base
  has_many  :answers
end

class Answers < ActiveRecord::Base
  belongs_to: question
  validates :comment, presence: true
end
Run Code Online (Sandbox Code Playgroud)

打电话的时候

question = Question.new
question.answers.build
question.valid?
Run Code Online (Sandbox Code Playgroud)

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

has_many :answers, validate: false
Run Code Online (Sandbox Code Playgroud)

Question valid?回报中true.

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

dee*_*our 7

这绝对不是一个bug.

  • 你创造了一个 Question
  • 你已经告诉Rails附加一个新实例Answer并将它与这个新实例联系起来Question
  • 然后你问"Rails,Question/Answer我创建的模型和关联是否已准备好保存到数据库中?"

正如您所发现的,Rails会在您的案例中说"不".

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

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

请注意:autosave => false与不声明不同:autosave. 如果:autosave选项不存在,则保存新关联.

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