2016-03-25 4 views
0

Ich verwende chartkick, um Diagramme in meiner Rails App zu rendern. Und ich möchte groupdate verwenden, um die Daten für die letzten 7 Tage abzufragen, die 0 erhalten, wenn ein Tag nicht anwesend ist.Wie gruppiert man nach Tag und addiert eine berechnete Eigenschaft mit GroupDate?

Ich weiß, dass ich es so verwenden kann:

project.time_entries.group_by_day(:created_at, last: 7, format: "%a\n%d %b").count 

Allerdings habe ich nicht die Anzahl der Datensätze gefunden erhalten will, ich will, anstatt die Summe aus einem berechneten Feld bekommen:

class TimeEntry < ActiveRecord::Base 
    def duration_sec 
    (self.time.end - self.time.begin).to_i 
    end 
end 

so, wenn es gab 4 Aufzeichnungen am 25. März statt sich:

{"20 Mar"=>0, "21 Mar"=>0, "22 Mar"=>0, "23 Mar"=>0, "24 Mar"=>0, "25 Mar"=>4, "26 Mar"=>0} 

ich möchte die Gesamtsumme von 01 erhaltenfür diesen Tag. Deshalb mag ich so etwas wie dies mit DateGroup erreichen:

project.time_entries.group_by{ |a| a.created_at.to_date.to_s }.map { |k, v| { k => v.sum(&:duration_sec) } } 

Ich habe auch versucht, so etwas wie diese:

project.time_entries.group_by_day(:created_at, last: 7, format: "%a\n%d %b").sum(&:duration_sec) 

aber ich erhalte einen Fehler Argument Ausnahme.

Antwort

0

Soweit ich weiß, kann ActiveRecord :: Calculations # sum benutzerdefinierte Methoden nicht aufrufen. In der Zwischenzeit könnte dies eine Abhilfe sein ..

TimeEntry.unscoped.select(:duration_sec) 
    .from(project.time_entries.select('time_end - time_begin AS durations_sec, created_at')) 
    .group_by_day(:created_at, last: 7, format: "%a\n%d %b").sum(:duration_sec) 
+0

Zeit ist ein tsrange von postgresql, ich denke, das ist, warum dies nicht funktioniert für mich, wissen Sie, wie Sie die 'beginnen' und 'Ende' Werte aus einem Bereich eingeben Postgres? –

+0

Ok, ich benutze 'Upper (Zeit) - Lower (Zeit)' und es scheint zu funktionieren. Das Format des Wertes ist jedoch ein String wie 'hh: mm: ss' und ich benötige ihn tatsächlich in float-Werten –

0

von @cozyconemotel Antwort, ich es geschafft, zu bekommen, was ich so benötigt:

TimeEntry.from(time_entries.select('(EXTRACT(EPOCH FROM (UPPER(time) - LOWER(time)))) AS duration, created_at')).group_by_day(:created_at, last: 7, format: "%a\n%d %b").sum(:duration) 

Diese den Zeitstempel extrahiert in Sekunden und nicht in ein String-Format, das ist, was ich brauchte

Verwandte Themen