ruby-on-rails - 为什么 ActiveRecord 会自动验证 has_many 关联

标签 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_associated 的使用与 has_many关系:http://guides.rubyonrails.org/active_record_validations_callbacks.html#validates_associated

最佳答案

绝对是不是 一个错误。

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

  • 正如您所发现的,Rails 会说 “不”在你的情况下。

    我没用过也不在意validates_associated .但是,我可以向您指出文档,解释为什么您会看到自己的行为。
  • Active Record Autosave Association

  • 尽管上述源文件中的文档值得一读,但我会为您提取这一部分

    Note that :autosave => false is not same as not declaring :autosave. When the :autosave option is not present new associations are saved.


  • 您尚未指定 :autosave => SOMETHING在您的 :answers协会
  • 因此,默认情况下,Rails 将尝试保存您的新构建/关联 Answer在您的新 Question
  • 保存将失败,因为 Answer无效
  • 关于ruby-on-rails - 为什么 ActiveRecord 会自动验证 has_many 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15680111/

    相关文章:

    ruby-on-rails - Rails 3验证IPv4和IPv6格式

    ruby-on-rails - 没有 View 的 Rails ActionMailer

    ruby-on-rails - Ruby on Rails 命令和约定——它们是什么?

    ruby-on-rails - 基础数据库关联

    .net - 选择哪个验证框架 : Spring Validation or Validation Application Block (Enterprise LIbrary 4. 0)?

    javascript - 客户端文件大小验证 javascript

    ruby-on-rails - Rails 错误消息 - 1 的参数 2 数量错误

    ruby-on-rails - 如何使用 rails sunspot 在 solr 中加入模型

    javascript - 如何将部分表单的数据传递给 Rails 操作(使用 JavaScript 且不使用嵌套属性)?

    ruby-on-rails-3 - 如何更改 twitter-bootstrap 中文本区域的列数?