Dans ma méthode de contrôleur pour la vue d'index j'ai la ligne suivante.Pourquoi la méthode where() exécute-t-elle des requêtes SQL après que toutes les relations imbriquées ont été chargées?
@students_instance = Student.includes(:memo_tests => {:memo_target => :memo_level})
Ainsi, pour chaque Student
je hâte charge toute l'information nécessaire.
Plus tard dans un bloc .map
, j'appelle la méthode .where()
sur l'une des relations comme indiqué ci-dessous.
@all_students = @students_instance.map do |student|
...
last_pass = student.memo_tests.where(:result => true).last.created_at.utc
difference_in_weeks = ((last_pass.to_i - current_date.to_i)/1.week).round
...
end
Cela conduit à une seule requête SQL pour chaque student
. Et comme j'ai plus de 300 étudiants, cela conduit à des temps de chargement très lents et à plus de 300 requêtes SQL. J'ai raison de penser que cela est dû à la méthode .where()
. Je pense que c'est parce que j'ai tout vérifié et ce sont les deux lignes qui causent toutes les requêtes.
Plus important encore, existe-t-il une meilleure façon de faire cela qui réduit ces requêtes à une seule requête?
Vous souhaitez donc recevoir un dernier memo_test pour chaque étudiant? –
Chose est cette requête sera assez compliquée et je ne suis même pas sûr si c'est possible de faire dans ActiveRecord. Peut-être que vous devrez aller quelque chose comme suite ou écrire vous-même sql –
Pas exactement, j'ai déjà accès à «memo_tests» de chaque élève sans lancer une requête. Je veux exécuter la méthode '.where', sans utiliser de requête SQL. – nonsequiter