基于日期的输出数组(按天计算的销售数字)

时间:2010-03-06 08:59:54

标签: ruby-on-rails ruby

我有一个名为'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

然而,这并不起作用,因为所有时间戳都有时间。

对于糟糕的头衔提前道歉,我似乎无法想到一个合理的头衔。

2 个答案:

答案 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])
}

虽然我认为您应该尝试使用单个查询来获取它,而不是每天都使用一个查询。