1

アップデート

最終的に、 everyonegemを使用してデータを取得する専用の統計モデルとテーブルを作成しました。詳細については、私自身の回答をご覧ください。

元の質問

Ruby on Railsアプリケーションで、管理ページに、時間の経過に伴うサイトのユーザー数を表示するグラフを作成したいと思います。

グラフには、昨年のすべての日付のユーザー数が表示されます。

新しいユーザーが来ると曲線は上がり、ユーザーが削除されると曲線は下がります。

これは私が求めているJSONの結果になります。

[
    {
        "date": "23-01-2013",
        "users": 3201
    },
    {
        "date": "24-01-2013",
        "users": 3451
    },
    {
        "date": "25-01-2013",
        "users": 4351
    },
    {
        "date": "26-01-2013",
        "users": 3950
    },
    {
        "date": "27-01-2013",
        "users": 4150
    }
]

統計モデルを作成し、統計モデルを更新するbefore_createフィルターとbefore_destroyフィルターをユーザーモデルに追加することを検討しました。

より良い方法とおそらくこれを行う宝石はありますか?これが何と呼ばれているのかわからないので、私は解決策を見つけられなかったと思います。

4

2 に答える 2

1

統計モデルは1つの可能性です。モデルを追加したくない場合は、適切なSQLクエリを作成するだけで、たとえば、MySQLで毎年使用できる新しいユーザーの数を一覧表示できます。

SELECT Year(created_at) as 'year', COUNT(id) as 'users' 
       FROM users GROUP BY Year(created_at); 
# or
SELECT DATE_FORMAT(created_at, '%Y') as 'year', COUNT(id) as 'users' 
       FROM users 
       GROUP BY DATE_FORMAT(created_at, '%Y');

毎月の新規ユーザー数は、MySQLのDATE_FORMAT関数を同様に使用します。

SELECT DATE_FORMAT(created_at, '%X.%m') as 'year', COUNT(id) as 'users' 
       FROM users 
       GROUP BY DATE_FORMAT(created_at, '%X.%m'); 
于 2013-01-24T16:49:23.713 に答える
0

解決策は、データベースに統計モデルとテーブルを作成することでした。私はeverythinggemを使用して、統計モデルでwrite_statsメソッドを毎日実行しています。少し重いかもしれませんが、そこから引き出すのに最適なデータが得られます。

これがいつでも宝石のschedule.rbです

set :output, "#{path}/log/cron.log"

every :day, at: "11:58 PM" do
  runner "Statistics.write_count"
end

そしてこれが統計モデルです

class Statistics < ActiveRecord::Base
  def self.write_count
    stats = Statistics.new
    stats.users = User.count
    stats.save!
  end
end

統計テーブルにはタイムスタンプがあるため、クエリが簡単になります。

これが1つです

@stats = Statistics.where(created_at: (Time.now.years_ago(1)..Time.now))
于 2013-01-25T09:32:29.347 に答える