スタック オーバーフロー プロファイル ページと同様のユーザー統計 (合計アクセス数、バッジ数など) を含むサイドバーがあるユーザー プロファイル ページがあります。
問題は、現在、データベースにアクセスして、すべてのリクエストでこれらの統計を計算していることです。これを削減するためにフラグメント キャッシングを実装できますが、この種のことを処理するためのより良い方法はありますか?
集計された要約データをデータベースに保存すると、問題 (つまり、不整合) が発生する可能性があるようです。
スタック オーバーフロー プロファイル ページと同様のユーザー統計 (合計アクセス数、バッジ数など) を含むサイドバーがあるユーザー プロファイル ページがあります。
問題は、現在、データベースにアクセスして、すべてのリクエストでこれらの統計を計算していることです。これを削減するためにフラグメント キャッシングを実装できますが、この種のことを処理するためのより良い方法はありますか?
集計された要約データをデータベースに保存すると、問題 (つまり、不整合) が発生する可能性があるようです。
次を使用して、この情報を再計算する代わりにデータベースに保存できます。
User
例として、バッジの数を測定する場合、という名前のデータベース フィールドを作成badges_count
し、Badge モデルで を作成できますbelongs_to :user, :counter_cache => true
。これで、バッジの数が変わるたびに、 で新たに計算することなくカウントにアクセスできます@user.badges_count
。
基本的な実装: http://asciicasts.com/episodes/23-counter-cache-column
単純なカウントよりも複雑な動作を測定するフィールドがあるとします。この場合、 、 、 などを使用して特定のアクションが発生するたびにフィールドを更新するコールバックを実装するbefore_save
だけafter_save
ですbefore_create
。
データベースにデータを保存することは、間違っている場合にのみ一貫性がなくなります。統計を更新できるパスの数は限られているため、使用しているフィールドを更新する際にすべてのパスがカバーされるようにする必要があります。Rails は counter_caching を使用してこれを行います。カスタム コールバックを使用する場合や異常な状況が発生した場合は、自分で行う必要があります。
この質問のように非表示の div を使用できます ( 非表示の div を使用してデータをキャッシュする)。キャッシュするデータの量によっては、これが適切な解決策になる場合があります。