ruby on rails平均每天

时间:2009-08-13 15:57:51

标签: ruby-on-rails

我正在尝试生成一个人每天平均通话次数的报告。以下内容生成正确的列表,但如果用户在某一天没有拨打任何电话,则不会显示。 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卡在Open Flash Charts的值中,它打破了它,看起来好像进入了一个无限循环。所以我进入我的调试器,看看发生了什么。

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]

如何让这一天上升,而不是第二天?

3 个答案:

答案 0 :(得分:0)

尝试使用

Date.today.at_beginning_of_month.to_s(:db)

Date.today.tomorrow.to_s(:db)

代替。

答案 1 :(得分: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] ) }

答案 2 :(得分:0)

正如您所发现的那样,Time在内部以秒为单位表示,并且一段时间产生一系列秒。另一方面,一系列日期会产生一系列日期。

(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的工作。