2011-08-03 3 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

이 시도 할 수 있습니다 당신과 같이 루비의 Array을 연장하는 경우 Btw는

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를 반복하는 것이 전혀 나쁘지 않은 경우가 있습니다. 때로는 엉덩이에 고통이 될 수도 있습니다. –