0

我在一个数据库表中有这种数据结构:

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}

有什么方法可以通过一个查询以我需要的格式获取数据?

编辑:设置“零天”:

  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

我构建了这个片段,它将检查过去一周内数据库中没有数据的日子。它可以工作,但我认为它不是很有效,因为如果我想查看过去一个月/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 回答