3

毎月の合計金額を計算しようとしている寄付テーブルがあります。寄付のない月については、結果が 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}

空の月を取得する方法はありますか?

4

2 に答える 2

4

通常、欠けている月を取得するためにカレンダー テーブル (またはgenerate_seriesPostgreSQL) に結合したままにしますが、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、結果を取得できます。

于 2012-07-26T18:57:23.333 に答える
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)
于 2014-01-16T00:48:58.537 に答える