2016-06-18 2 views
1

안녕하세요 저는 이처럼 일정표가 있습니다.루비 루프 날짜 위로

<ActiveRecord::Relation [#<Schedule id: 427, date: "2016-06-15", notes: nil, price: "350", promo: "", status: "available", boat_id: 45, created_at: "2016-06-09 19:43:15", updated_at: "2016-06-09 19:43:15">, #<Schedule id: 428, date: "2016-06-16", notes: nil, price: "350", promo: "", status: "available", boat_id: 45, created_at: "2016-06-09 19:43:15", updated_at: "2016-06-09 19:43:15">, #<Schedule id: 429, date: "2016-06-17", notes: nil, price: "350", promo: "", status: "available", boat_id: 45, created_at: "2016-06-09 19:43:15", updated_at: "2016-06-09 19:43:15">, #<Schedule id: 430, date: "2016-06-22", notes: "", price: "253", promo: "", status: "available", boat_id: 3, created_at: "2016-06-14 09:23:55", updated_at: "2016-06-14 09:23:55">, #<Schedule id: 431, date: "2016-06-23", notes: "", price: "253", promo: "", status: "available", boat_id: 3, created_at: "2016-06-14 09:23:55", updated_at: "2016-06-14 09:23:55">] 

및 사용자 입력 "출발"및 "종료"날짜. 나는 이러한 솔루션의 생각 ..

을 나는이 날짜 사이의 일정 테이블에 루프 싶습니다

a = "2016-06-16".in_time_zone('UTC') 
b = "2016-06-19".in_time_zone('UTC') 

등의 변수가 (A와 B) 말과 가격의 합계를 얻을 수 있다는 것, I 말할 수있다;

a = "2016-06-16".in_time_zone('UTC') 
b = "2016-06-19".in_time_zone('UTC') 
schedules = Schedule.all 
price = 0 

dates = [] 
while a < b do 
dates << a 
a += 1.day 
end 

그런 다음;

dates.each do |date| 
    schedules.each do |schedule| 
    if (date == schedule.in_time_zone('UTC')) 
     price += schedule.price.to_i 
    end 
    end 
end 

그러나 이것이 가장 편리한 방법인지는 알 수 없습니다.

답변

5

왜 DB 네이티브 구현을 활용하지 않을까요? SQL로 할 수 있습니다.

date_from = "2016-06-16".in_time_zone('UTC') 
date_to = "2016-06-19".in_time_zone('UTC') 

Schedule 
    .where(date: date_from..date_to) # sql BETWEEN operator 
    .sum("price") # SQL aggregate function. 
+1

범위를 'where'로 전달할 수 있습니다. ?? 굉장합니다. – maxhm10

+1

@ maxhm10 가능합니다. [범위 조건] (http://guides.rubyonrails.org/active_record_querying.html#hash-conditions)을보십시오. –