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.
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.
Wenn Sie nur die Summe der Spalten total_marks und marks_obtetain möchten, versuchen Sie dies
%Vor% Eine andere Methode ist ActiveRecord::Calculations.pluck
und dann Enumerable#sum
auf dem äußeren Array und wieder auf dem inneren Array-Paar:
Die resultierende SQL-Abfrage ist einfach:
%Vor% Das anfängliche Ergebnis von pluck
ist ein Array von Array-Paaren, z. B .:
.map(&:sum)
wird sum
für jedes Paar ausführen, das Paar zusammenfassen und das Array flacher machen:
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.
Tags und Links ruby-on-rails activerecord