Ruby on rails 为什么ActiveRecord自动验证有很多关联

Ruby on rails 为什么ActiveRecord自动验证有很多关联,ruby-on-rails,ruby-on-rails-3,validation,activerecord,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 valid?返回false,因为关联的答案无效。写作时 has_many :answers, validate: false 在问题中有效?返回

给出了以下模型:

class Question < ActiveRecord::Base
  has_many  :answers
end

class Answers < ActiveRecord::Base
  belongs_to: question
  validates :comment, presence: true
end
valid?
返回
false
,因为关联的答案无效。写作时

has_many :answers, validate: false
问题中
有效?
返回


这是一个错误还是在使用
时需要\u许多相关模型自动验证?Rails指南明确解释了与
关联的
的使用有很多关系:

它肯定不是一个bug

  • 您已经创建了一个
    问题
  • 您已经告诉Rails附加一个新的
    Answer
    实例,并将其与这个新的
    问题关联起来
  • 然后您会问“Rails,这是我创建的
    问题/答案
    模型和关联,可以保存到数据库中了吗?”
正如您所发现的,Rails在您的情况下会说“不”

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

尽管上述源文件中的文档值得完整阅读,但我将为您抽出这一部分

注意:autosave=>false与不声明:autosave不同。 当:autosave选项不存在时,将保存新关联。

  • 您尚未在您的
    :answers
    关联上指定
    :autosave=>内容
  • 因此,Rails在默认情况下将尝试在新的
    问题上保存新构建/关联的
    答案
  • 保存将失败,因为
    答案无效

我已覆盖父模型中的
有效?
,以便处理验证,同时考虑嵌套关联的状态:

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

为什么它不验证正在创建的模型?我不创建模型,我只验证问题。为什么打电话提问是有效的?触发每个答案的验证,尽管没有显式设置validate_关联。我不尝试保存问题,我只调用valid?因此,在这个问题上,autosave不是我想要的。当拥有一个有效的关联时?不会在关联记录上自动调用。为什么这里有很多不同之处。我不想依赖一个可能是bug并在下一个版本中修复的行为。
save
调用
valid
作为其过程的一部分。如果要避免此行为,请在关联上设置
:autosave=>false
。除了告诉您这不是一个bug,指向解释推理和行为的文档,并在“修复”您选择进行更改时遇到的问题的正确方向,我无能为力。autosave_association.rb中的此评论解释了该行为“除非:validate is+false+,否则将验证子记录。”但很奇怪,它没有应用于has_one,所以至少存在一个大的不一致性,或者可能是一个bug。感谢您的帮助。
def valid?(context=nil)
  super(context) && self.answers.map(&:valid?).all?
end