2009-08-13 7 views
0

1日あたりの平均コール数のレポートを生成しようとしています。次の例では正しいリストが生成されますが、ユーザが特定の日に電話をかけていない場合は表示されません。上記のリンクを通って行くVery much like this problem1日あたりの平均ルビーレンダー

、私はこのコードを持っている:オープンフラッシュチャートの値に最初に、私だけで立ち往生call_avesで

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

を、そしてそれを破った、それが行ったように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] 

これは、1日ではなく2日でどのように上昇するのですか?

答えて

0

ではなく

Date.today.at_beginning_of_month.to_s(:db) 

Date.today.tomorrow.to_s(:db) 

を使用してみてください。あなたが出て見つけたとして

+0

これは既に試されていますが、例外がスローされます。 "2009-08-01 00:00:00"のための未定義のメソッド 'strftime ':文字列。 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の仕事ではありません。

関連する問題