Проверка модельных отношений в рельсах - PullRequest
0 голосов
/ 02 октября 2009

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

class Book < ActiveRecord::Base
  has_many :chapters

  def build_chapters(count)
    (1..count).each do |i|
      chapters.build(:sequence_number => i)
    end
  end
end

class Chapter < ActiveRecord::Base
  belongs_to :book

  validates_presence_of :book_id, :sequence_number
end

class BooksController < ApplicationController
  def create
    @book = Book.new(params[:book])
    @book.build_chapters(4) #to simplify example, hardcode number of chapters
    @book.save
    # View-related code omitted for simplicity
  end
end

Когда я запускаю это, я получаю одну ошибку "главы недействительны" на главу (4 ошибки, когда жестко запрограммированы как пример) Явная установка: book_id в вызове сборки не помогает.

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

Я новичок в рубине и рельсах, так что вполне возможно, что я просто еще не думаю о рельсах. Пожалуйста, просветите меня.

Ответы [ 2 ]

1 голос
/ 02 октября 2009

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

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

0 голосов
/ 02 октября 2009

Как и вы, я новичок в Ruby и Rails, но поможет ли validates_associated? Подробности в документации по API на http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M002171.

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