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!
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