1

プロファイルのビュー数に基づいてホームページにユーザーをリストしようとしています。ユーザーはページ分割されており、ユーザーをキャッシュして、プロファイルが新しいビューを取得するたびにそのキャッシュを無効にしようとしています。

私のコントローラーコード:

def index
  @users = Rails.cache.read(params[:page])
  if !@users.nil?
    flash[:info] = "Cache was hit."
  else
    flash[:info] = "Miss."
    @users = User.paginate(page: params[:page], per_page: 5, order: "views DESC")
    Rails.cache.write(params[:page], @users)
  end
end

最初にページ 2 に移動すると、予想どおりキャッシュ ミスが発生し、更新すると、やはり予想どおりキャッシュ ヒットが発生します。ただし、コンソールを介して手動でユーザーを変更し、viewsページ 2 を更新すると、ページがキャッシュからレンダリングされるはずだったにもかかわらず、コンソールで行った変更がページに影響を与えました。上部の通知には、「キャッシュがヒットしました」と記載されていました。

コンソールで実行Rails.cache.read("2")して、コントローラーがキャッシュしたものを取得すると、次のようになりました。

User Load (0.4ms)  SELECT "users".* FROM "users" ORDER BY views DESC LIMIT 5 OFFSET 0
(0.2ms)  SELECT COUNT(*) FROM "users" 
=> users freshly pulled from the database

コンソールを介して手動でUser.paginate値をキャッシュすると、呼び出されたときにクエリが表示されませんでしたRails.cache.read:

test = User.paginate(page: 1, order: "views DESC")
=> users freshly pulled from the database
Rails.cache.write("9", test)
=> true
Rails.cache.read("9")
=> users from test; no queries displayed above this

コントローラー コードが結果ではなくクエリをキャッシュしている理由がわかりません。アドバイスをいただければ幸いです。

4

1 に答える 1

0

IIRC ActiveRecord は「怠惰」になり、クエリ オブジェクトをキャッシュしているだけです。User.paginate() の後に .all を追加して、SQL を強制的に実行し、結果セットをキャッシュしてください。

.all が失敗した場合は、代わりに .map/.select/.inject を試してください。

于 2012-09-06T11:18:47.170 に答える