2010-03-06 62 views
1

我有一个名为'cost'的浮动表和名为'created_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 

然而,由于所有的时间戳有一个时间以及这行不通。

为穷人头衔道歉,我似乎无法想到一个明智的。

回答

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 

这将总结一天的订单成本,然后创建索引0是过去24小时内的数组。它也只需要一个查询,而您的示例则需要31个。

要更改截止日期,请将31.days.ago替换为Time类的一个实例。这里的文档:http://ruby-doc.org/core/classes/Time.html

祝你好运!

+0

这看起来不错,仍然试图了解代码。目前它也输出日期 - 我如何删除它?如何在每个条目之间添加逗号分隔符? – vectran 2010-03-07 23:57:28

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

虽然我想你应该尝试使用单个查询,而不是让一个每天它得到。