ruby-on-rails - Rails ActiveRecord : Skip validations for associations

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

我重新询问 this question 因为代码和示例是错误的(它实际上在所示的情况下有效)。

鉴于这些模型:

class Author < ActiveRecord::Base
  has_many :books
  validates_presence_of :email
end

class Book < ActiveRecord::Base
  belongs_to :author
  validates_presence_of :title
end

我们可以在创建 Book 时跳过验证:
b = Book.new
b.save(:validate => false)

但是如果我们从数据库中检索到无效的 Book 并将其分配给 Author 中的关联,则不允许保存 Author:
a = Author.new
a.email = "foo"
a.books = Book.all
a.save!

这是错误:

ActiveRecord::RecordInvalid: Validation failed: Books is invalid



我们如何跳过关联 Book 模型的验证而不跳过 Author 的验证?

请注意,在 Author 中说 has_many :books, :validate => false 没有帮助:关联被悄悄丢弃,而 Author 已保存。

最佳答案

试试看

class Author < ActiveRecord::Base
  has_many :books, :validate => false
  validates_presence_of :email
  after_save :save_invalid_books

  def save_invalid_books
    books.each do |b|
      b.save(false)
    end
  end
end

据我了解,validate => false 只允许您保存作者而不会被无效书籍阻止,但要保存关联,您需要一本有效书籍,因为您将更改 author_id 键。
您无法更改 rails 内部结构,但您仍然可以通过在未经验证的情况下保存作者,然后更新每本书并在之后立即强制保存(使用 save(false))来欺骗它。

当然,可以通过多种方式增强此代码,因为可能没有必要每次都保存所有书籍以开始使用,但您明白了。

关于ruby-on-rails - Rails ActiveRecord : Skip validations for associations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4393885/

相关文章:

ruby-on-rails - Ruby 1.8 中所有空格的 gsub 字符串

ruby-on-rails - gem install syck -v '1.0.1' 不起作用

ruby-on-rails - 将数据库约束转换为 Rails 验证

ruby-on-rails - 遍历 has_many 时访问关联的连接模型 :through association

ruby-on-rails - Rails 3 嵌套模型未知属性错误

ruby-on-rails - 如果你需要 sudo su 到另一个用户,你可以使用 capistrano 吗?

正则表达式验证

javascript - 如何在我的所有 Web 表单中重用一个 jquery 验证函数?

ruby-on-rails-3 - Active Record Query - 在多个列中搜索多个字符串,只有全部包含才返回

ruby-on-rails - Activerecord:为表使用别名时出现类型错误