2010-03-06 70 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]) 
} 

雖然我想你應該嘗試使用單個查詢,而不是讓一個每天它得到。

相關問題