Summe für mehrere Spalten mit ActiveRecord

8

Ich bin neu bei Active Records. Ich möchte auf mehrere Spalten eines Modells Student summieren. Mein Modellschüler ist wie folgt:

%Vor%

Ich möchte so etwas:

%Vor%

Aber es gibt folgenden Fehler.

%Vor%

Ich frage also, ob ich das Modell zweimal für das Obige abfragen muss, d. h. eines, um totale Marken zu finden, und ein anderes, um die erhaltenen Marken zu finden.

    
Joy 20.02.2014, 18:06
quelle

4 Antworten

13

Sie können bei Bedarf auch Raw SQL verwenden. So etwas, um ein Objekt zurückzugeben, wo Sie die Werte extrahieren müssen ... Ich weiß, dass Sie active record angeben!

%Vor%

Für Schienen 4.2 (früher nicht aktiviert)

%Vor%

Beachten Sie die Klammern, die der Anweisung folgen. Ohne es gibt die Anweisung eine Class :: ActiveRecord_Relation zurück, nicht die AR-Instanz. Das Bedeutende daran ist, dass Sie first NICHT für die Relation verwenden können.

%Vor%     
penner 20.02.2014, 18:14
quelle
6

Wenn Sie nur die Summe der Spalten total_marks und marks_obtetain möchten, versuchen Sie dies

%Vor%     
YasirAzgar 25.01.2017 08:27
quelle
2

Eine andere Methode ist ActiveRecord::Calculations.pluck und dann Enumerable#sum auf dem äußeren Array und wieder auf dem inneren Array-Paar:

%Vor%

Die resultierende SQL-Abfrage ist einfach:

%Vor%

Das anfängliche Ergebnis von pluck ist ein Array von Array-Paaren, z. B .:

%Vor%

.map(&:sum) wird sum für jedes Paar ausführen, das Paar zusammenfassen und das Array flacher machen:

%Vor%

Schließlich wird .sum auf dem reduzierten Array zu einem einzelnen Wert führen.

Bearbeiten:

Beachten Sie, dass Ihre Datenbank, obwohl nur eine einzige Abfrage vorhanden ist, eine Ergebniszeile für jeden Datensatz zurückgibt, der in where übereinstimmt. Diese Methode verwendet Ruby, um die Summierung durchzuführen. Wenn also viele Datensätze (d. H. Tausende) vorhanden sind, kann langsamer sein als SQL die Berechnungen selbst ausführen zu lassen, wie in der akzeptierten Antwort angegeben.

    
Marc Greenstock 13.03.2016 18:42
quelle
2

Sie können rupfen verwenden, um direkt die Summe zu erhalten:

%Vor%

Sie können die gewünschten Spalten oder berechneten Felder zur Methode pluck hinzufügen und es wird ein Array mit den Werten zurückgegeben.

    
AlexGuti 15.12.2017 11:53
quelle

Tags und Links