如何按天分组并将计算的属性与GroupDate相加?

时间:2016-03-25 20:08:57

标签: ruby-on-rails chartkick

我使用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)

但是我得到了一个参数错误异常。

2 个答案:

答案 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)

这会以秒为单位提取时间戳,而不是字符串格式,这就是我需要的