Rails ActiveRecord: Skip validations for associations

Dav*_*ips 4 validation activerecord ruby-on-rails associations ruby-on-rails-3

I'm re-asking this question because the code and example is wrong (it actually works in the case shown).

Given these models:

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

class Book < ActiveRecord::Base
  belongs_to :author
  validates_presence_of :title
end
Run Code Online (Sandbox Code Playgroud)

我们可以在创建图书时跳过验证:

b = Book.new
b.save(:validate => false)
Run Code Online (Sandbox Code Playgroud)

但是,如果我们从数据库中检索无效的Book并将其分配给Author中的关联,则不允许我们保存Author:

a = Author.new
a.email = "foo"
a.books = Book.all
a.save!
Run Code Online (Sandbox Code Playgroud)

这是错误:

ActiveRecord :: RecordInvalid:验证失败:图书无效

我们如何跳过相关图书模型的验证而不为作者跳过它们?

请注意,has_many :books, :validate => false在Author中说不起作用:在保存作者的情况下静默丢弃关联.

Nyc*_*cen 13

试试吧

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
Run Code Online (Sandbox Code Playgroud)

据我所知,validate => false只允许您保存作者而不会被无效的书籍停止,但是为了保存关联,您需要一本有效的书籍,因为您将更改author_id键.您无法更改rails内部,但您仍然可以通过保存作者而不进行验证来欺骗它,然后更新每本书并立即强制保存(使用save(false)).

当然,这段代码可以通过多种方式得到增强,因为每次开始时可能没有必要保存所有书籍,但是你明白了.