Ruby on Rails: Une fois que vous avez hâte chargé une association qui a des conditions, comment pouvez-vous nous mettre au travail sans toucher à nouveau la base de données?
-
24-09-2019 - |
Question
Imaginez un simple cas comme ceci:
class Book
has_many :chapters
end
Disons que dans mon contrôleur je fais quelque chose comme ceci:
book = Book.find(:first,
:include => :chapters,
:conditions => ['chapters.title = ?', "In the beginning"]
Maintenant, disons que je veux afficher le chapitre. Comment puis-je répondre aux chapitres de Rails sans frapper à nouveau la base de données? Si je fais quelque chose comme ceci:
chapters = book.chapters.select{|chapter| chapter.title == "In the beginning"}
sera Rails rehit la base de données pour tous les chapitres afin qu'il puisse les analyser, puis pire encore, doivent les analyser tous à nouveau dans le code du contrôleur?
Et il semble que quelque chose qui utilise trouver comme ceci:
chapters = Chapter.find_by_book_id_and_title(book.id, "In the beginning")
provoque la base de données à nouveau touchée même si elle le chapitre est déjà mis en mémoire cache.
La solution
Utilisation: include =>: les chapitres devraient chercher tous de retour pour un total de 2 requêtes selon l'API Association AR . De là, vous devriez être en mesure de parcourir les données sans toucher à nouveau la base de données. Il est une simple question de boucle à travers book.chapters à ce moment-là, toutes les données doivent être disponibles.
Notez que ActiveRecord met en cache uniquement la dernière requête, donc en faisant une autre requête comme Chapter.find_by_book_id_and_title ( « title ») votre requête de Book.chapters avant ne sera pas mise en mémoire cache (car il est tout à fait différent).