2011-04-12 58 views
3

所以我使用ActiveRecord来获得的项目数在某一天:Rails的ActiveRecord组按时间但填充零值的日期?

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

但是,这并没有给我0如果对于某一天没有记录,我怎么能解决这个问题?还是有更多的“Rails”方式做这样的事情?

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

回答

3

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

我会做什么来得到你想要的是创建一个新的哈希默认值为0然后合并你的结果查询到。当您随后尝试从该哈希中检索没有条目的任何值时,您将得到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} 

不知道什么导致它...嗯。

+0

嗯..我得到了:'TypeError:无法将数组转换为哈希',发生了'合并!',奇怪......这是怎么回事吗? – 2011-04-12 17:58:47

+0

我假定您使用的Arel语法等效于 .count(:group =>:created_at),它将返回一个有序哈希,但也许这些不相同。 – 2011-04-12 18:38:37

+0

哦 - 等一下。我复制了'.values',但那会丢失日期键。编辑... – 2011-04-12 18:41:03