3

次のような単純なケースを想像してみてください。

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")

チャプターがすでにキャッシュされている場合でも、データベースが再度ヒットします。

4

1 に答える 1

3

:include =>:chaptersを使用すると、すべてがフェッチされ、ARAssociationAPIに従って合計2つのクエリが生成されます。そこから、データベースに再度触れることなくデータをトラバースできるはずです。その時点でbook.chaptersをループするだけで、すべてのデータが手元にあるはずです。

ActiveRecordは最後のクエリのみをキャッシュするため、Chapter.find_by_book_id_and_title('title')のような別のクエリを実行しても、以前のBook.chaptersクエリはキャッシュされないことに注意してください(完全に異なるため)。

于 2010-03-04T07:34:46.767 に答える