2011-08-03 13 views
1

2つの日付間の平均時間(日)を計算したいと思います。彼らが参加して平均を取得してから各ユーザの日数を知りたい。2日間の平均時間ルビー

(Date.today - User.first.created_at.to_date).to_i 

特定のユーザーに適しています。今私はすべてのユーザーをループして平均を取得したいと思います。そのようなことを達成するには?

User.all.map{|u| (Date.today - u.created_at.to_date).to_i}.sum/User.count 
+0

または、dbからの平均値を直接取得するクエリを作成できます。 – rubish

+0

この場合、クエリはどのように見えますか? – Gaelle

+0

MySQLを使用している場合は 'SELECT SUM(DATEDIFF(NOW()、created_at))/ COUNT(ID)FROM users'の行に何かがあります。 http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff、http://developer.postgresql.org/pgdocs/postgres/functions-datetime.html – rubish

答えて

0

あなたはこれを試すことができますが、そのようにRubyのArrayを拡張する場合ところで

User.all.sum { |user| (Time.now - user.created_at)/1.day }.to_i/User.count 

を:

class Array 
    def avg(&block) 
    sum(&block).to_i/count 
    end 
end 

あなたは素敵な操作を行うことができますショートバージョン:

User.all.avg { |user| (Time.now - user.created_at)/1.day } 
+0

Gaelle

+0

答えが簡素化されました – Hck

0

それとも、この試すことができます:

+0

しかし、これはすべてのユーザーに対して繰り返されます。ユーザーが多い場合は大ヒットになります。 – rubish

+0

はい、そうですが、SQLに書き込むのはデータベースに非常に依存しています。私は、このような問題は独立して解決しなければならないと考えています。時にはRuby 'Arrayを反復することはまったく悪くないこともあります。時には、本当にお尻に痛みを感じることもあります。 –

関連する問題