0

最近、ユーザー アクティビティ追跡機能をアプリケーションに追加しました。この機能は、複数のモデルとのユーザー インタラクションと、各モデル内の複数の異なるアクションを追跡します。

class User

  has_many :activities, :order => 'created_at desc'     

  def log_activity(object, type)
    activities.create(:subject_type => object.class.name, :subject_id => object.id, :subject_action_type => type)
  end 

end

ユーザーがさまざまなオブジェクトを作成/更新/削除した後にこのメソッドを呼び出し、このアクティビティをユーザー プロファイルに表示します。しばらくすると、Activities テーブルに非常に多くのレコードが含まれるようになり、ロード時間に影響を与えるようになると思います。これをユーザーフレンドリーな方法で管理し、データベースをスムーズに実行し続けるには、どのような実装がよいか考えていました。

x時間後に古いレコードをクリーンアップする、ある種のスケジュールされたタスクを設定することを考えていました。おそらく、これを達成する方法についてアドバイスをしたり、より良い解決策を推奨したりできますか?

選択したデータベースとしてPostgreSQLを使用しています。

4

1 に答える 1

0

遅延activities読み込みは、要求しない限り、関連付けられているすべてのアクティビティを取り込まないためです。だからあなたがこれを言うとき:

activities.create(...)

データベースに対して行っているのは単一の INSERTだけです。select * from activities where ...ビルドする必要はなく、呼び出しactivitiesからの INSERT だけがあります。create

したがって、メソッドから心配する必要はありませんlog_activity

テーブルのサイズを制限したい場合はactivities、簡単です:

Activity.connection.execute("delete from activities where created_at < now() - interval '10 days'")

時々、枯れ木を一掃するのに問題ないはずです。'10 days'もちろん、これは説明のためのものです。

于 2012-08-11T00:15:07.093 に答える