计算月统计

我有一个捐款表,我正在尝试计算每个月的总金额。 没有任何捐款的几个月,我希望结果返回0。

这是我当前的查询:

Donation.calculate(:sum, :amount, :conditions => { :created_at => (Time.now.prev_year.all_year) }, :order => "EXTRACT(month FROM created_at)", :group => ["EXTRACT(month FROM created_at)"]) 

返回:

 {7=>220392, 8=>334210, 9=>475188, 10=>323661, 11=>307689, 12=>439889} 

任何想法如何抓住空虚的月份?

通常你会加入一个日历表(或PostgreSQL中的generate_series )来获取丢失的月份,但Rails最简单的事情就是将你的结果合并为一个零的哈希值; 像这样的东西:

 class Donation def self.by_month h = Donation.calculate(:sum, :amount, :conditions => { :created_at => (Time.now.prev_year.all_year) }, :order => "EXTRACT(month FROM created_at)", :group => ["EXTRACT(month FROM created_at)"]) Hash[(1..12).map { |month| [ month, 0 ] }].merge(h) end end 

然后只需调用类方法h = Donation.by_month即可获得结果。

除了mu太短的答案,在Rails 3.2.12中对我不起作用,ActiveRecord将键作为字符串返回:

 h = Donation.calculate(:sum, :amount, :conditions => { :created_at => (Time.now.prev_year.all_year) }, :order => "EXTRACT(month FROM created_at)", :group => ["EXTRACT(month FROM created_at)"]) 

哪个回报:

 {"7"=>220392, "8"=>334210, "9"=>475188, "10"=>323661, "11"=>307689, "12"=>439889} 

所以当我将哈希与零合并时:

 {1=>0, 2=>0, 3=>0, 4=>0, 5=>0, 6=>0, 7=>0, 8=>0, 9=>0, 10=>0, 11=>0, 12=>0, "7"=>220392, "8"=>334210, "9"=>475188, "10"=>323661, "11"=>307689, "12"=>439889} 

小修复(to_s):

 Hash[(1..12).map { |month| [ month.to_s, 0 ] }].merge(h)