2010-03-06 3 views
1

'비용'이라는 타임 스탬프와 '생성 된 날짜'라는 타임 스탬프가있는 테이블이 있습니다.날짜 기반 출력 배열

지난 달의 각 특정 요일에 대해 비용을 합산하여 배열을 출력하고 싶습니다. 같은

뭔가 : 모든 타임 스탬프뿐만 아니라 시간을 가지고

@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

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

당신이 그것을 대신 매일 하나를 만드는 하나의 쿼리를 사용하여 점점 시도해야한다고 생각하지만.

관련 문제