0

DBテーブルの1つにこのデータ構造があります:

id | user_id | amount | created_at
 1 |    1    |   3.4  | 2013-09-14 10:10:00 
 2 |    1    |   2.1  | 2013-09-17 10:10:00
 3 |    1    |   7.9  | 2013-09-17 10:10:00
 4 |    1    |   0.2  | 2013-09-16 10:10:00
 5 |    1    |   6.3  | 2013-09-18 10:10:00
 6 |    1    |   11.9 | 2013-09-18 10:10:00

目的の出力: [0, 0, 3.4, 0, 0.2, 10, 18.2] - 過去 7 日間の各ユーザーの毎日の列の金額を合計した配列を取得する必要があります。

これまでのところ、次のようなものを取得できます。

Model.where('user_id = ? AND created_at > ? AND created_at < ?', current_user.id, week, today).group(:created_at).sum(:amount)

次の形式でデータを生成します。

{2013-09-13 23:00:39 UTC=>5.68, 2013-09-16 23:30:35 UTC=>2.55}

たった 1 つのクエリで必要な形式のデータを取得する方法はありますか?

編集:「ゼロ日」の設定:

  today = Date.today
  week = today - 7
  daily = Model.where('user_id = ? AND created_at > ? AND created_at < ?', current_user.id, week, today).group(:created_at).sum(:amount)
  new_value_in_array = false
  unless daily.empty?
    @daily = Array.new
    week.upto(today) do |step|
      daily.each do |d|
        if step.to_s == d[0].strftime('%Y-%m-%d').to_s
          @daily << d[1]
          new_value_in_array = true
        end
      end
      if new_value_in_array == false
        @daily <<  0
      end
      new_value_in_array = false          
    end
  end

過去 1 週間でデータベースにデータがない日をチェックするこのスニペットを作成しました。動いていますが、過去1ヶ月/3ヶ月/6ヶ月のデータを確認したい場合、計算に時間がかかるのであまり効果的ではないと思います。

より効果的な解決策の提案はありますか?

どうもありがとう!

4

2 に答える 2

0

これはあなたが望むものですか?

Model.where('user_id = ? AND created_at > ? AND created_at < ?', current_user.id, week, today).group(:created_at).sum(:amount).values
于 2013-09-18T11:30:34.363 に答える
0
start_date =  Date.today - 7
end_date = Date.today

# get sum for non zero dates
hsh = Model.where('user_id = ? AND created_at > ? AND created_at < ?', current_user.id, start_date, end_date).group(:created_at).sum(:amount)
# =>  [3.4, 0.2, 10, 18.2]

#add zero dates to the hsh
start_date.step(end_date,1).map{|d| hsh[d] ||= 0 }
# => [0, 0, 3.4, 0, 0.2, 10, 18.2] 

#dates with zero sum
hsh.select{|k,v| v ==0 }.keys
# => [2013-09-12, 2013-09-13, 2013-09-15]
于 2013-09-19T07:28:51.523 に答える