我有一个名为'cost'的浮动表和名为'creative_at'的时间戳。
我希望输出一个数组,汇总上个月每个特定日期的费用。
类似的东西:
@newarray = [] #creating the new array
month = Date.today.month # Current Month
year = Date.today.year # Current Year
counter = 1 # First Day of month
31.times do #for each day of the month (max 31)
#adding sales figures for that day
@newarray.push(Order.sum(:cost, :conditions => {:created_at => "#{year}-#{month}-#{counter}"}))
counter = counter + 1 #go onto next day
end
然而,这并不起作用,因为所有时间戳都有时间。
对于糟糕的头衔提前道歉,我似乎无法想到一个合理的头衔。
答案 0 :(得分:1)
您应该可以使用以下代码:
sales_by_day = Order.sum(:cost,
:group => 'DATE(created_at)',
:conditions => ['DATE(created_at) > ?', 31.days.ago])
(0..30).collect { |d| sales_by_day[d.days.ago.to_date.to_s] || 0 }.reverse
这将按天计算订单成本,然后创建索引为最后24小时的数组。它也只需要一个查询,而你的例子需要31个。
要更改截止日期,请将31.days.ago替换为Time类的实例。这里的文档:http://ruby-doc.org/core/classes/Time.html
祝你好运!答案 1 :(得分:1)
这应该有效:
(Date.today.beginning_of_month..Date.today.end_of_month).map { |d|
Order.sum(:cost, :conditions => ['created_at >= ? AND created_at < ?', d, d+1])
}
虽然我认为您应该尝试使用单个查询来获取它,而不是每天都使用一个查询。