2

グラフをプロットして、過去30日間のユーザー数の増加を確認したいと思います。

したがって、次のような配列になります:(インクリメンタル配列)

 [0,100,250,500,1000,1100.....5000,5500]

解決策1:これを行うための愚かな方法は、毎日クエリを実行することです。

  (30.days.ago.to_date..Date.today).map {|date| User.where("Date(created_at) <= ?" , date).count}

ただし、これにより30個のクエリが発生します。

解決策2: group byオプションを使用してすべてのレコードを検索し、それをループして前のレコードを合計します。

 User.group('Date(created_at)').count
 (30.days.ago.to_date..Date.today).map {|date| counts[date] || 0} //and again loop over it
 //and now start summing up previous ones elements to get an another array..

しかし、どちらの解決策も役に立たない。これを最適化されたものにするための提案。

4

2 に答える 2

0

私は次のことをします:

growth = []
users =  User.group('Date(created_at)').count

(30.days.ago.to_date..Date.today).each do |day|
  growth.push(growth.sum + (users[day] || 0))
end

テストされていませんが、アイデアは得られます。

于 2012-11-28T22:32:46.420 に答える
0

これはSQL自体で実行できるはずです。

例:次の表があります

+---------+---------------------+
| user_id | training_start_date |
+---------+---------------------+
|   15981 | 2012-10-08 06:12:45 |
|   15981 | 2012-10-08 06:13:26 |
|   15981 | 2012-10-08 06:29:34 |
|   15981 | 2012-10-08 06:33:53 |
| 1005933 | 2012-10-08 07:41:54 |
+---------+---------------------+

毎日何人のユーザーがトレーニングを受けたかを知りたいときは、

select count(user_id), training_start_date from training_users group by DATE_FORMAT(training_start_date, "%M %e, %Y");

これは私を助けたリンクです

HTH

于 2012-11-28T21:36:31.983 に答える