В Rails как соблюдать: scope при использовании validates_uniqueness_of во встроенной форме объекта? - PullRequest
0 голосов
/ 28 мая 2010

У меня есть модель Книги, в которой есть_ главы (которые принадлежат_Книге).

Я хочу обеспечить уникальность названий глав, но только в рамках одной книги. Суть в том, что форма для создания глав встроена в форму модели Book (модель Book принимает accept_nested_attributes_for: chapters).

В модели главы:

 
validates_uniqueness_of(
    :chapter_title, 
    :scope => :book_id,
    :case_sensitive => false,
    :message => "No book can have multiple chapters with the same title.")

Однако, когда я отправляю форму создания книги (которая также включает в себя несколько встроенных форм глав), если заголовок главы существует в другой главе для другой книги, я не сдаю тест проверки.

Book.create( :chapters => [ Chapter.new(:title => "Introduction"), Chapter.new(:title => "How to build things")

=> Book 1 successfully created

Book.create( :chapters => [ Chapter.new(:title => "Introduction"), Chapter.new(:title => "Destroy things")
=> Book 2 fails to validate

second_book = Book.create( :chapters => [ Chapter.new(:title => "A temporary Introduction title"), Chapter.new(:title => "Destroy things")
=> Book 2 succesfully created

second_book.chapters[0].title= "Introduction"
=> success

second_book.chapters.save
=> success

second_book.save
=> success

Может кто-нибудь пролить свет на то, как это сделать? Или почему это происходит?

1 Ответ

0 голосов
/ 28 мая 2010

это потому, что Book получает главы с book_id, установленным в NULL, и не устанавливает их book_id до проверки, потому что у них нет идентификатора на этом шаге.

Первое решение - использовать метод Book.build_chapter (), но для каждой главы потребуется отдельный вызов метода

секунда - это использовать accepts_nested_attributes_for и создать книгу типа:

  book_attrs = {
    :chapters_attributes => [
      { :title => 'Intro' },
      { :title => 'Core' },
      { :title => 'Outro'}
    ]
  }

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