如何计算记录和按日期分组,包括0记录的天数?

时间:2014-04-19 01:03:26

标签: ruby-on-rails postgresql activerecord

在ActiveRecord中,如何查询Event模型以获取每天创建的大量记录,包括未创建记录的日期?

例如,如果我本周七天中有四天创建了活动,我希望它返回[2, 4, 0, 1, 0, 7, 3]

到目前为止,我的查询看起来像这样:
Event.where(name: name).order('date(created_at)').group('date(created_at)').count.values,但它只会返回[2, 4, 1, 7, 3],这会在创建过去X天内创建的事件图表时无效。

谢谢!

3 个答案:

答案 0 :(得分:1)

试试这个,

一旦你获得了小组计数,

event_counts_hash = Event.where(name: name).order('date(created_at)').group('date(created_at)').count

record_count_array = [0] * 7

event_counts_hash.each { |k, v| count_array[k.cwday] = v  }

您应该在count_array中获取工作日计数。

答案 1 :(得分:0)

请勿尝试自行滚动,只需使用this库。它为您处理所有边缘包,包括不同的每周开始日期,以无记录开头的范围等。

您具体问题的答案是:

# Unscope is optional, but probably what you want if there is a default_scope.
Event
  .unscoped
  .group_by_day(:created_at)
  .where(name: name)
  .count

但是如果你想要它在一个时间范围内,请确保不要将它放在where子句中,因为它会错过范围开头和结尾的空值。

range = 10.days.ago..2.days.ago

Event
  .unscoped
  .group_by_day(:created_at, range: range)
  .where(name: name)
  .count

它将包括整个范围内的值。

答案 2 :(得分:-1)

我最近开源chart_data.js(WIP),这是一个客户端微库,可以处理那些需要表示时间序列数据但系列不完整的情况。

示例:

var from = moment('20140101', 'YYYYMMDD');
var to = moment('20140101', 'YYYYMMDD');

var sampleData = [['2014', '01', '01', '100'], ['2014', '03', '01', '300'], ['2014', '04', '01', '100']];

var chartData = new ChartData(sampleData, from, to, 'months');
var data = chartData.data; 

// [1388534400000, 100], [1391212800000, 0], [1393632000000, 300], [1396310400000, 400]

看看它,我希望您觉得它很有用,并会感谢您的反馈。