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?

StackOverflow https://stackoverflow.com/questions/2377495

  •  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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top