Ruby on Rails: как только вы загрузите ассоциацию, в которой есть условия, как вы можете получить ее, не касаясь базы данных снова? - PullRequest
3 голосов
/ 04 марта 2010

Представьте себе простой случай, подобный этому:

class Book
  has_many :chapters
end

Допустим, в моем контроллере я делаю что-то вроде этого:

book = Book.find(:first, 
                 :include => :chapters, 
                 :conditions => ['chapters.title = ?', "In the beginning"]

Теперь, допустим, я хочу показать главу. Как я могу обратиться к главам в Rails без повторного попадания в базу данных? Если я сделаю что-то вроде этого:

chapters = book.chapters.select{|chapter| chapter.title == "In the beginning"}

Пересмотрит ли Rails базу данных для всех глав, чтобы он мог их сканировать, и, что еще хуже, придется снова сканировать их все в коде контроллера?

И, похоже, что-то, что использует find, выглядит так:

chapters = Chapter.find_by_book_id_and_title(book.id, "In the beginning")

вызывает повторное попадание в базу данных, даже если глава уже кэширована.

1 Ответ

3 голосов
/ 04 марта 2010

Использование: include =>: главы должны получить все это обратно, в результате чего в общей сложности будет получено 2 запроса в соответствии с API ассоциации AR .Оттуда вы сможете просматривать данные, не касаясь базы данных снова.С этой точки зрения просто перебирать book.chapters, все данные должны быть под рукой.

Обратите внимание, что ActiveRecord кэширует только последний запрос, поэтому, выполняя другой запрос, например Chapter.find_by_book_id_and_title ('title') ваш предыдущий запрос Book.chapters не будет кэширован (потому что он совершенно другой).

...