2016-11-27 1 views
0

je le code suivant dans mon contrôleur:Pourquoi mon code génère-t-il une requête supplémentaire?

@unanswered_questions = Question.unanswered_with_tag(params[:tag_id]).paginate(per_page: 10, page: params[:page]) 

Ce qui appelle cette méthode dans mon Question modèle:

def self.unanswered_with_tag id 
    joins(:taggings).where(taggings: { tag_id: id }).where(questions: { num_answers: 0}) 
end 

J'attends une requête SQL qui va chercher les 10 premières questions sans réponse sur cette page, mais mes journaux montrent 2 requêtes:

Question Load (0.4ms) SELECT "questions".* FROM "questions" 
INNER JOIN "taggings" ON "taggings"."question_id" = "questions"."id" 
WHERE "taggings"."tag_id" = $1 AND "questions"."num_answers" = $2 
ORDER BY "questions"."id" ASC LIMIT $3 OFFSET $4 
[["tag_id", 3], ["num_answers", 0], ["LIMIT", 1], ["OFFSET", 0]] 

^^ Notez la partie LIMIT 1.

Et la seconde requête:

SELECT "questions".* FROM "questions" INNER JOIN "taggings" 
    ON "taggings"."question_id" = "questions"."id" 
    WHERE "taggings"."tag_id" = $1 AND "questions"."num_answers" = $2 
    LIMIT $3 OFFSET $4 
    [["tag_id", 3], ["num_answers", 0], ["LIMIT", 10], ["OFFSET", 0]] 

qui a LIMITE 10.

Pourquoi ce comportement?

+0

Avez-vous essayé de combiner vos clauses '.where'? – Eric

+0

Note sur 'ORDER BY" questions "." Id "ASC' partie - le code fourni n'a pas de commande, vous devez trouver le code qui fait la commande. Il pourrait y avoir un ordre implicite par id quand vous appelez 'first' sur une relation. – MikDiet

Répondre

0

Exécutez-vous du code dans votre vue qui vérifie si @unanswered_questions a des lignes du tout (#exists? Par exemple) pour afficher les valeurs ou non?