Summe über mehrere Spalten mit Activerecord
Ich bin neu in Activerecord. Ich will tun, Summe über mehrere Spalten von einem Musterschüler. Mein Modell student ist wie folgt:
class Student < ActiveRecord::Base
attr_accessible :class, :roll_num, :total_mark, :marks_obtained, :section
end
Will ich sowas:
total_marks, total_marks_obtained = Student.where(:id=>student_id).sum(:total_mark, :marks_obtained)
Aber es gibt folgenden Fehler.
NoMethodError: undefined method `except' for :marks_obtained:Symbol
Also Frage ich ob ich die Abfrage des Modells zwei mal für die oben genannten, D. H. zu finden, insgesamt markiert und eine andere zu finden, die Markierungen, die.
- können Sie zeigen Ihr Modell , und welche Spalte deiner Tabelle hat ?
- Welche Fehler sind Sie immer?
- Ich bin immer NoMethodError: undefined method `außer' für :total_marks_obtained:Symbol
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie raw-SQL, wenn Sie benötigen. So etwas wie dieses, um ein Objekt zurückgeben, wo müssen Sie zum extrahieren der Werte... ich weiß, dass Sie angeben, active record!
Für rails 4.2 (früher deaktiviert)
Hinweis: die Klammer hinter der Aussage. Ohne es die Anweisung gibt eine Klasse::ActiveRecord_Relation, nicht die AR-Instanz. Was daran bedeutsam ist, dass Sie NICHT verwenden können
first
auf die Beziehung..first
ist, für mich zu arbeiten auf 4.2.5includes()
. Ich fand Sie tatsächlich liefern aggragate Funktionen inpluck()
, z.B.Student.pluck("sum(total_mark)", "sum(marks_obtained)")
als hier beantwortet: stackoverflow.com/a/41606066/2067695Können Sie zupfen direkt zu erhalten, die Summe:
Können Sie fügen Sie die gewünschten Spalten oder in berechneten Feldern zu
pluck
Methode, und wird es wieder ein array mit den Werten.flatten
auf das Ergebnis.Wenn Sie wollen einfach nur die Summe der Spalten total_marks und marks_obtained, versuchen Sie, diese
Andere Methode ist, um
ActiveRecord:: - Berechnungen.zupfen
dannEnumerable#Summe
auf das äußere array und wieder auf den inneren array-pair-Mädchen:Die resultierende SQL-Abfrage ist einfach:
Dem ersten Ergebnis der
pluck
wird ein array mit der array-Paare, z.B.:.map(&:sum)
laufensum
auf jedes paar, insgesamt das paar und die Abflachung der array:Schließlich
.sum
auf der abgeflachten array wird in eine single Wert.Edit:
Beachten Sie, dass, während es gibt nur einen einzigen Abfrage der Datenbank ist ein Ergebnis zurückgeben Zeile für jeden Datensatz übereinstimmung in den
where
. Diese Methode verwendet ruby zu tun, die insgesamt, also, wenn es viele Datensätze (also Tausende), diese kann langsamer als mit SQL führen Sie die Berechnungen selbst, wie bereits in der Antwort akzeptiert.pluck
zu erhalten, direkt die Summe:Student.where(id: student_id).pluck('SUM(total_mark)', 'SUM(marks_obtained)')
Ähnlich wie die akzeptierte Antwort, aber ich würde vorschlagen, mit arel wie folgt vor, um zu vermeiden string-Literale (abgesehen von der Umbenennung von Spalten, falls erforderlich).
welches eine
ActiveRecord::Relation
Ergebnis, über die Sie iterieren, oder, wie Sie bekommen nur eine Zeile, die Sie verwenden können.first
(zumindest für mysql).