3 votes

Est-ce que .select et .where sont responsables des requêtes N+1 dans les rails ?

J'ai deux méthodes ici, distinct_question_ids et @correct_on_first attempt. L'objectif est de montrer à l'utilisateur combien de questions à choix multiples distinctes ont reçu une réponse correcte.

Le second me permettra de savoir combien de ces QCM distincts ont reçu une réponse correcte lors de la première tentative. (Un utilisateur peut essayer un QCM plusieurs fois).

Maintenant, lorsqu'un utilisateur répond à des milliers de questions et a des milliers de réponses d'utilisateur, la page pour montrer leur performance prend 30 secondes à une minute à charger. Je pense que c'est dû à la méthode .select, mais je ne sais pas comment remplacer .select sans utiliser .select, puisqu'elle boucle comme .each.

Existe-t-il une méthode qui ne provoque pas N+1 ?

distinct_question_ids = @user.user_answers.includes(:multiple_choice_question).
  where(is_correct_answer: true).
  distinct.pluck(:multiple_choice_question_id)

@correct_on_first_attempt = distinct_question_ids.select { |qid|
  @user.user_answers.
    where(multiple_choice_question_id: qid).first.is_correct_answer
}.count

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X