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