2017-02-05 5 views
0

folgende Modell Konstellation:Rails zählen und Gruppe von zwei Attributen

class Attempt < ApplicationRecord 
    belongs_to :user 
    belongs_to :answer 
    belongs_to :question 
end 
class Answer < ApplicationRecord 
    belongs_to :question 
end 
class Question < ApplicationRecord 
    has_many :answers 
    has_many :attempts 
end 

A Question mehrere Antworten hat, wo man als korrekt markiert (Spalte correct). Der Benutzer versucht, die richtige Antwort auf eine Frage zu erraten.

Herausforderung: Ich möchte für einen Benutzer für jede Frage wissen, wie viele Versuche erfolgreich waren (richtige Antwort gewählt) und wie viele Fehler, ohne mehrere/viele Abfragen gegen die Datenbank zu feuern.

Was mir am nächsten zu einer befriedigenden Antwort gebracht hat, war Question.joins(attempts: [:answer]).group('(attempts.question_id, answers.correct)').count (ignoriere den dortigen Benutzer so weit). Resultierende SQL:

SELECT COUNT(*) AS count_all, (attempts.question_id, answers.correct) AS attempts_question_id_answers_correct FROM "questions" INNER JOIN "attempts" ON "attempts"."question_id" = "questions"."id" INNER JOIN "answers" ON "answers"."id" = "attempts"."answer_id" GROUP BY (attempts.question_id, answers.correct) 

Die Werte sind korrekt, aber das Ergebnis sieht ziemlich seltsam mit diesen "(1, f) usw." Schlüssel:

{"(1,f)"=>4, "(3,t)"=>2, "(2,t)"=>4, "(2,f)"=>11, "(3,f)"=>6, "(1,t)"=>4} 

Ich würde jede mögliche Hilfe besonders auf dem Resultset schätzen :). Vielen Dank im Voraus!

+0

Im Moment habe ich es so wie es ist, änderte sich die _QUERY_ zu 'Question.joins (Versuche: [: Antwort]). Gruppe ([ 'attempts.question_id ',' answers.correct ']). count' und hab '{[1, false] => 4, [3, true] => 2, [2, true] => 4, [2, false] => 11, [3, falsch] => 6, [1, richtig] => 4} out. Nicht perfekt, aber etwas zum Arbeiten. Cooler Lösungen noch gefragt;) ... – seppsepp

Antwort

0

Haben Sie versucht, dies:

Question.joins(attempts: [:answer]).select("attempts.question_id as question_id, answers.correct as correct_answer").group('(attempts.question_id, answers.correct)').count