2009-08-13 4 views
0

Я пытаюсь создать отчет для среднего количества вызовов, которые человек делает в день. Следующее генерирует правильный список, но если пользователь не совершал никаких вызовов в определенный день, он не отображается. Very much like this problemрубин на рельсах средний за день

Проходя по ссылке выше, у меня есть этот код:

from_date = Time.now.at_beginning_of_month.to_s(:db) 

to_date = Time.now.tomorrow.to_s(:db) 

ave_calls = @current_user.calls.average(:num_of_calls, group => "DATE(calls.start_time_stamp)", 
:conditions => ["calls.created_at BETWEEN ? AND ?",from_date, to_date]) 

call_aves = (Time.now.at_beginning_of_month..Time.now.tomorrow).map{|dt| [dt, ave_calls[dt.strftime "%Y-%m-%d"] || 0]} 

Сначала я просто застрял в call_aves значение для открытого флэш карт, и он сломал ее, kind've выглядел он пошел в бесконечный цикл. Поэтому я вошел в свой отладчик, чтобы узнать, что происходит.

irb(#<ReportsController:0x47b7524>):008:0> call_aves[0] 
=> [Sat Aug 01 00:00:00 -0400 2009, 0] 

Поскольку я поднимаюсь в массиве, я замечаю, что он увеличивается только за секунды, а не по дням. Например:

irb(#<ReportsController:0x47b7524>):009:0> call_aves[30] 
=> [Sat Aug 01 00:00:30 -0400 2009, 0] 

Как я могу получить это, чтобы подняться днем, а не вторым?

ответ

0

Попробуйте использовать

Date.today.at_beginning_of_month.to_s(:db) 

и

Date.today.tomorrow.to_s(:db) 

вместо этого.

+0

Пробовал это уже, выбрасывает исключение. undefined метод 'strftime 'для" 2009-08-01 00:00:00 ": String. strftime и to_s не любят друг друга. – Ryan

+0

Похоже, вы используете strftime для фильтрации времени из объекта Time, оставляя только дату. Использование объекта Date не включает время, поэтому strftime не требуется. Просто используйте to_s и формат даты. Дополнительная информация о форматах дат: http://onrails.org/articles/2008/08/20/what-are-all-the-rails-date-formats – Jarrod

0

Попробуйте использовать

days = (Date.today.at_beginning_of_month..Date.today.tomorrow) 
call_aves = days.map { |dt| call_aves.push([dt, ave_calls[dt.to_s(:db)] || 0]) } 
0

Как вы уже выяснили, время внутренне представлены в отсчету секунд, и диапазон времени производит диапазон секунд. С другой стороны, диапазон дат дает ряд дат.

(Date.today.beginning_of_month..Date.today).each do |date| 
    #copy paste your code here 
end 

Вам не нужно указывать даты для ActiveRecord - Rails делает это за вас. Например, для модели с отметками времени:

Model.find(:conditions => ["created_on > ?", Date.today - 7.days]) 

получает объекты, созданные за последнюю неделю. Обратите внимание, что я не претендую на превращение объектов данных, чтобы MySQL им нравился - это работа ActiveRecord.

Смежные вопросы