Rails ActiveRecord按时间分组,但填充日期为零值?

时间:2011-04-12 06:18:42

标签: ruby-on-rails activerecord

所以我使用activerecord来获取某一天的项目数量:

Item.group("date(created_at)").count.values

但如果某一天没有记录,这不会给我0,我该如何解决?或者有更多的“Rails”方式做这样的事情?

非常感谢任何帮助,再次感谢!

1 个答案:

答案 0 :(得分:3)

使用GROUP BY查询,您将根据存在的记录获取组,因此如果分组列中没有给定值的记录,则该值不会有任何组。数据库在心理上并不知道要添加您可能感兴趣的其他日期值。

我要做的就是创建一个新的Hash,其默认值为0,然后将查询结果合并到其中。当您随后尝试从没有条目的Hash中检索任何值时,您将得到0作为结果。

修改:删除.values

date_counts = Hash.new(0)
date_counts.merge! Item.group("date(created_at)").count

或者,如果你想确保哈希中某个范围内的每个日期都有条目,那么你可以迭代这些条目,......

date_counts = {}
(Date.civil(2010,1,1)...Date.civil(2010,2,1)).each do |date|
  date_counts[date]=0
end
date_counts.merge! Item.group("date(created_at)").count

<强>更新

当我将日期范围和模型传递到此处时,这是一些输出,奇怪的是它会得到不同长度的哈希值:

{Sun, 01 May 2011=>0, Mon, 02 May 2011=>0, Tue, 03 May 2011=>0, Wed, 04 May 2011=>0, Thu, 05 May 2011=>0, Fri, 06 May 2011=>0, Sat, 07 May 2011=>0, Sun, 08 May 2011=>0, Mon, 09 May 2011=>0, Tue, 10 May 2011=>0, Wed, 11 May 2011=>0, Thu, 31 Mar 2011=>2, Sun, 03 Apr 2011=>1, Fri, 08 Apr 2011=>643, Sat, 09 Apr 2011=>2360, Sun, 10 Apr 2011=>705, Mon, 11 Apr 2011=>34}
{Sun, 01 May 2011=>0, Mon, 02 May 2011=>0, Tue, 03 May 2011=>0, Wed, 04 May 2011=>0, Thu, 05 May 2011=>0, Fri, 06 May 2011=>0, Sat, 07 May 2011=>0, Sun, 08 May 2011=>0, Mon, 09 May 2011=>0, Tue, 10 May 2011=>0, Wed, 11 May 2011=>0, Sat, 02 Apr 2011=>1, Fri, 08 Apr 2011=>4158, Sat, 09 Apr 2011=>12206, Sun, 10 Apr 2011=>4279, Mon, 11 Apr 2011=>169}
{Sun, 01 May 2011=>0, Mon, 02 May 2011=>0, Tue, 03 May 2011=>0, Wed, 04 May 2011=>0, Thu, 05 May 2011=>0, Fri, 06 May 2011=>0, Sat, 07 May 2011=>0, Sun, 08 May 2011=>0, Mon, 09 May 2011=>0, Tue, 10 May 2011=>0, Wed, 11 May 2011=>0}

不确定是什么造成的......嗯。