【问题标题】:Why ActiveRecord automatically validates has_many association为什么 ActiveRecord 会自动验证 has_many 关联
【发布时间】:2013-03-28 11:03:15
【问题描述】:

给出以下模型:

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

Questionvalid?返回true

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

【问题讨论】:

  • 为什么不会验证正在创建的模型?
  • 我不创建模型我只验证问题。为什么要调用 question.valid?尽管没有明确设置 validate_associated ,但会触发每个答案的验证。

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


【解决方案1】:

这绝对是不是错误。

  • 您创建了一个Question
  • 你告诉 Rails 附加一个新的Answer 实例并将它与这个新的Question 关联起来
  • 然后你问 “Rails,我创建的 Question/Answer 模型和关联是否可以保存到数据库中?”

如您所见,Rails 会在您的情况下说 “否”

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

虽然上述源文件中的文档值得完整阅读,但我会为您提取这一点

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

  • 您尚未在 :answers 关联中指定 :autosave =&gt; SOMETHING
  • 因此,Rails 默认会尝试将新构建/关联的Answer 保存在新的Question
  • 保存将失败,因为Answer 无效

【讨论】:

  • 我不尝试保存我只调用有效的问题?因此,自动保存不是我想要的。当拥有一个有效的关联时?不会在关联记录上自动调用。为什么 have_many 在这里有所不同。我不想依赖可能存在错误并在下一个版本中修复的行为。
  • save 调用 valid 作为其过程的一部分。如果您想避免这种行为,请在关联上设置 :autosave =&gt; false。除了告诉您这不是错误,指向解释推理和行为的文档,并让您朝着“解决”您选择进行更改时遇到的问题的正确方向前进之外,我无能为力。
  • autosave_association.rb 中的这条注释解释了行为 “子记录被验证,除非 :validate 为 +false+。” 但很奇怪的是它不适用于 has_one,因此至少存在很大的不一致或错误。感谢您的帮助。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2011-05-22
    • 2010-12-13
    相关资源
    最近更新 更多