我使用chartkick
在我的rails应用中呈现图表。我希望使用groupdate
查询过去7天的数据,如果一天不存在,则会获得0。
我知道我可以这样使用它:
project.time_entries.group_by_day(:created_at, last: 7, format: "%a\n%d %b").count
但是,我不想得到找到的记录数,我想要获得计算字段的总和:
class TimeEntry < ActiveRecord::Base
def duration_sec
(self.time.end - self.time.begin).to_i
end
end
所以,如果3月25日有4条记录而不是获得:
{"20 Mar"=>0, "21 Mar"=>0, "22 Mar"=>0, "23 Mar"=>0, "24 Mar"=>0, "25 Mar"=>4, "26 Mar"=>0}
我想获得当天duration_sec
的总和。所以我想用DateGroup
来完成这样的事情:
project.time_entries.group_by{ |a| a.created_at.to_date.to_s }.map { |k, v| { k => v.sum(&:duration_sec) } }
我也试过这样的事情:
project.time_entries.group_by_day(:created_at, last: 7, format: "%a\n%d %b").sum(&:duration_sec)
但是我得到了一个参数错误异常。
答案 0 :(得分:0)
据我所知,ActiveRecord :: Calculations#sum不能调用自定义方法。与此同时,这可能是一种解决方法..
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)
答案 1 :(得分:0)
来自@cozyconemotel回答,我设法得到了我需要的东西:
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)
这会以秒为单位提取时间戳,而不是字符串格式,这就是我需要的