2010-12-29 8 views
1

Hier ist ein bisschen Probe Kontext für meine Frage unten zu klären zu helfen, was ich frage ...Ist es möglich, dynamische Aggregat-Spalten in einer Arel Abfrage zu konstruieren, die eine Verknüpfung verwendet?

Das Schema

Users 
- id 
- name 

Answers 
- id 
- user_id 
- topic_id 
- was_correct 

Topics 
- id 
- name 

Die Daten

Users 
id | name 
1 | Gabe 
2 | John 

Topics 
id | name 
1 | Math 
2 | English 

Answers 
id | user_id | topic_id | was_correct 
1 |  1 |  1 | 0 
2 |  1 |  1 | 1 
3 |  1 |  2 | 1 
4 |  2 |  1 | 0 
5 |  2 |  2 | 0 

Was ich möchte, in einer Ergebnismenge haben, ist eine Tabelle mit einer Zeile pro Benutzer und zwei Spalten pro Thema, eine, die die Summe der richtigen Antworten für das Thema zeigt, ein Und eine, die die Summe der falschen Antworten für dieses Thema zeigt. Für die Probe obigen Daten würde diese Ergebnismenge wie folgt aussehen:

Mein gewünschte Ergebnis

users.id | users.name | topic_1_correct_sum | topic_1_incorrect_sum | topic_2_correct_sum | topic_2_incorrect_sum 
     1 | Gabe  | 1     | 1      | 1     | 0 
     2 | John  | 0     | 1      | 0     | 1 

Offensichtlich, wenn es mehr Themen in der Themen-Tabelle wäre, würde ich diese Abfrage wie neu sind correct_sum und incorrect_sums für jedes Thema, das, so ich sind auf der Suche nach einem Weg zu schreiben, dies ohne Hartcodierung topic_ids in die Summenfunktionen meiner select-Klausel vorhanden ist.

Gibt es eine intelligente Art und Weise diese Art der Sache mit Arel zu Magie?

Antwort

0

Gabe,

Was Sie hier suchen ist eine Kreuztabellenabfrage. Es gibt viele Ansätze, dies zu schreiben, leider keine, die in SQL generisch genug sind. AFAIK Jede Datenbank behandelt Kreuztabellen unterschiedlich. Eine andere Art, dies zu betrachten, ist ein "Cube", etwas, das typischerweise in OLAP-Typ-Datenbanken (im Gegensatz zu OLTP) gefunden wird.

Seine leicht beschreibbar in SQL, aber wahrscheinlich sind einige Funktionen stammt aus der Datenbank Sie verwenden. Welche DB benutzen Sie?

Ihre Antworten Tisch sieht aus wie es 1,2,3,4,5 und nicht 1,1,1,1,1 als ids haben muss ...

+0

Danke für die Antwort, Steven. In meinem Fall bin ich mit Postgresql, und ich habe die Abfrage Ich brauche schon in SQL, es ist nur eklig SQL, die ich nicht liebe geschrieben habe und hatte gehofft, um zu sehen, vor allem für meine Erbauung, wenn Arel mir helfen Mach das in Rails 3. –

Verwandte Themen