2011-04-12 40 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