【问题标题】:Does Rails allow conditional validations for validates_associated?Rails 是否允许对 validates_associated 进行条件验证?
【发布时间】:2015-02-24 19:39:20
【问题描述】:

Rails 是否允许对 validates_associated 进行条件验证?我在 Rails 4.2.0 上看到以下内容。我是不是做错了?

型号:

class User < ActiveRecord::Base
  has_many :books

  validates_associated :books, if: :should_validate_book?

  def should_validate_book?
    return false
  end
end

class Book < ActiveRecord::Base
  belongs_to :user

  validates_presence_of :title
end

Book 的 title 属性的存在验证仍在运行(Rails 控制台):

> u = User.create!
 => #<User id: 2, created_at: "2015-02-24 19:34:51", updated_at: "2015-02-24 19:34:51">
> u.books.build
 => #<Book id: nil, user_id: 3, title: nil, created_at: nil, updated_at: nil>
> u.valid?
 => false
> u.books.first.errors
 => #<ActiveModel::Errors:0x007fa256b210d8 @base=#<Book id: nil, user_id: 3, title: nil, created_at: nil, updated_at: nil>, @messages={:title=>["can't be blank"]}>

【问题讨论】:

    标签: ruby-on-rails rails-activerecord


    【解决方案1】:

    事实证明,对于has_many 关系,validates_associated 默认为 ON。为了有条件地做到这一点,您需要在 has_many 声明中添加 validate: false :

      has_many :books, validate: false
    

    【讨论】:

      【解决方案2】:

      自远古以来,Rails 中的 validates_associated 只采用了 a list 的属性。除此之外,您可能会根据我从您粘贴的标准中收集的内容混淆模型之间的行为。更好的方法是调整 Book 模型中的验证以考虑变化,并让 Book 自行决定是否应验证对象。

      【讨论】:

      • 问题中的代码只是我编写的一个简单模型,用于说明我在 validates_associated 中看到的行为,所以我仍然认为 validates_associated 是要走的路。您链接到的页面显示方法签名validates_associated(*attr_names) public,这意味着它允许单个属性。我错过了什么吗?谢谢!
      猜你喜欢
      • 2010-12-02
      • 2012-04-05
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 2018-09-15
      • 2018-11-21
      • 1970-01-01
      • 2023-04-10
      相关资源
      最近更新 更多