2016-05-20 7 views
0

Ich habe zwei Modelle - Parent und Params, wo parent has_many paramsWie kann man einzelne SQL-Abfragen ausführen, um Spalten aus gruppierten Ergebnissen in ActiveRecord zu summieren?

Derzeit wie meine Methoden sehen (nicht, dass es unter Übergeordnete Klasse ist):

def total_sum 
    params.select(
    'params.*, (
     SUM(mono_volume_annular) + 
     SUM(day_volume_annular) + 
     SUM(night_volume_annular) + 
     SUM(exclusive_volume_annular) 
    ) AS summed_volume_annular' 
).group('params.id').sum(&:summed_volume_annular) 
end 

Wie kann ich diese SQL-Abfrage verbessern loswerden von .sum(&:summed_volume_annular) Methodenaufruf?

Wenn ich werde versuchen, es zu fassen, ohne :summed_volume_annular zu proc zu konvertieren, werde ich diesen Fehler: ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "summed_volume_annular" does not exist

Eine interessante Anmerkung - Wenn ich werde versuchen, das Ergebnis dieser Abfrage zu speichern

params.select('(
    SUM(mono_volume_annular) + 
    SUM(day_volume_annular) + 
    SUM(night_volume_annular) + 
    SUM(exclusive_volume_annular) 
) AS summed_volume_annular' 
) 

werde ich dieses Objekt [#<Parameter:0x00000009f1c7d8 id: nil>]

Seltsam bekommen, dass summed_volume_annular fehlt ...

+0

, wenn Sie mit 'Gruppe (‚params.id‘)' warum Sie verwenden 'innerhalb Abfrage sum' weil Ihre Gruppe immer einen Datensatz –

+0

@VishalJAIN haben, weil ich müssen mehrere Spalten zu einem zusammenfassen. Ich nannte es 'summed_volume_annular'. Ich benutze mehrere sum() Funktionen wegen [dieser] (http://stackoverflow.com/questions/22369336/mysql-sum-multiple-columns/22369527#comment42560192_22369527) –

Antwort

1

würde ich so etwas tun:

def total_sum 
    columns_to_sum = %w(mono_volume_annular day_volume_annular night_volume_annular 
         exclusive_volume_annular) 
    sum = columns_to_sum.map{ |col| "COALESCE(#{col}, 0)" }.join(' + ') 
    Params.sum(sum) 
end 
+0

Nun, ja, aber es beantwortet meine Frage nicht ... –

+0

Ich habe das Beispiel geändert, hoffe es hilft :) – Diego

+0

es ist fast das, was ich gesucht habe. Anstatt alle "Params" -Aufzeichnungen zusammenzufassen, musste ich nur die Zusammenfassung mit dem "Eltern" -Objekt zusammenfassen. Ich habe "Params" in "Params" geändert und das war's. Vielen Dank! –

Verwandte Themen