Rails ActiveRecord: пропустить проверки для ассоциаций - PullRequest
3 голосов
/ 09 декабря 2010

Я повторно задаю этот вопрос , потому что код и пример неверны (на самом деле это работает в показанном случае).

Учитывая эти модели:

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

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

Мы можем пропустить проверки при создании Книги:

b = Book.new
b.save(:validate => false)

Но если мы извлечем недопустимую Книгу из базы данных и назначим ее ассоциации в Авторах, нам не разрешено сохранять Автора:

a = Author.new
a.email = "foo"
a.books = Book.all
a.save!

Это ошибка:

ActiveRecord :: RecordInvalid: Ошибка проверки: Книги недействительны

Как пропустить проверки для связанныхЗаписывать модели, не пропуская их для Автора?

Обратите внимание, что высказывание has_many :books, :validate => false в Авторах не помогает: ассоциация, молча отброшенная с Авторами, сохраняется.

1 Ответ

12 голосов
/ 14 декабря 2010

Попробуйте это

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. Вы не можете изменить внутренности рельсов, но вы все равно можете обмануть это, сохранив автора без проверки, а затем обновив каждую книгу и принудительно сохраняя (с помощью save (false)) сразу после.

Конечно, этот код может быть улучшен разными способами, поскольку, вероятно, нет необходимости сохранять все книги каждый раз для начала, но вы поняли идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...