在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天内创建的事件图表时无效。
谢谢!
答案 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]
看看它,我希望您觉得它很有用,并会感谢您的反馈。