我有一个捐款表,我正在尝试计算每个月的总金额。没有任何捐款的几个月,我希望结果返回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}
任何想法如何抓住空虚的月份?
答案 0 :(得分:4)
通常你会加入一个日历表(或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
即可获得结果。
答案 1 :(得分:2)
除了 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)