2017-03-15 2 views
0

Ich habe eine Tabelle mit Fahrten und einer Spalte Wert und eine driver_id.GROUP und dann SUM innerhalb von Gruppen in Rails 5

Jetzt bin Auswahl ich alle Fahrten und gruppieren sie durch driver_id:

@rides = Ride.all.group_by(&:driver_id) 

Das gibt mir zum Beispiel:

{ "5":[ 
    { 
     "id":null, 
     "driver_id":5, 
     "value":936.0 
    }, 
    { 
     "id":null, 
     "driver_id":5, 
     "value":39.0 
    }, 
    { 
     "id":null, 
     "driver_id":5, 
     "value":63.0 
    }, 
    { 
     "id":null, 
     "driver_id":5, 
     "value":126.0 
    }  
] } 

So 5 (in diesem Fall, dass wir nur eine Gruppe haben) ist die Fahrer-ID und dann drinnen haben wir alle Fahrten. Jetzt möchte ich die Werte innerhalb jeder Gruppe summieren. Also, was ich will, ist so etwas wie:

{ "5":[ 
    { sum_value: XXXX } 
]} 

Das Objekt wahrscheinlich diferente aussehen, aber die Frage ist, wie die Summe innerhalb der Gruppen zu bauen?

+0

Mögliche duplikate von [rails 3 group by und sum] (http://stackoverflow.com/questions/9068926/rails-3-group-by-and-sum) – Ilya

+0

hast du zumindest versucht, es zu googeln? – Ilya

+0

ja, natürlich. – almo

Antwort

0

Dies könnte auf der DB-Ebene getan werden und grealty verbessern die Leistungen.

Wie auch immer, hier ist die Rubin-Rails-Version von dem, was Sie suchen:

@rides = Ride.all.group_by(&:driver_id) 
@rides.each do |driver_id, rides| 
    @rides[driver_id] = rides.inject(0) { |s, e| s+= e.value } 
end 

Dies wird scheitern, wenn eine der Fahrt Datensatz einen Wert hat, der keinen Float/Integer (ex: nil)

+0

Was würden Sie auf DB-Ebene vorschlagen? – almo

+0

@Ilya Ich genehmige deinen ersten Punkt, aber ich verstehe den zweiten Punkt nicht. Schlägst du vor, 'rides.inject (: +)' zu machen? das wird nicht funktionieren, weil Ride die '+' Methode nicht implementiert (und sollte wahrscheinlich nicht). Was vermisse ich? – MrYoshiji

+0

@almo Sie können einen Beitrag von Ilya in einem Kommentar auf Ihre Frage zu sehen – MrYoshiji