0

私の User Index アクションでは、同じ都市current_userと反対の性別に属するすべてのユーザーを検索し、結果profile_update_atDESC順番に並べ替えるクエリを実行しています。クエリは問題なく動作します。アプリは現在 3 都市で実行されています。したがって、都市 A のすべての男性は基本的に同じクエリを実行しており、都市 A の女性についても同様です。

このクエリを約 5 分間キャッシュできるようにしたいと考えています。どうやってやるの?どのタイプのキャッシュを使用する必要がありますか? クエリは都市と の性別に依存するため、current_user都市 A のユーザー用に作成されたキャッシュは、都市 B のユーザーのクエリを妨害しますか? または、都市 B のユーザー用に新しいキャッシュが作成されます。

4

1 に答える 1

2

Rails.cache ( http://guides.rubyonrails.org/caching_with_rails.html#cache-stores ) を使用できます。都市と性別の各組み合わせは、キャッシュの一意のキーです。したがって、インデックスアクションでは次のようなものになります: コントローラーコード:

def index
    @users = User.same_city_opp_gender_as(current_user)

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @users }
    end
end

モデルコード:

def self.same_city_opp_gender_as(user)
  Rails.cache.fetch("users/#{user.city}/#{user.gender}"){ User.where(city: user.city).where(gender: user.gender).order(:updated_at) }
end

また、User クラスは都市と性別のメソッドを提供する必要があります。3 つの都市 (A、B、C) と 2 つの性別 (M、F) の場合、次のキーを持つ 6 つのキャッシュを取得します。

  • 「ユーザー/A/M」
  • 「ユーザー/A/F」
  • 「ユーザー/B/M」
  • 「ユーザー/B/F」
  • 「ユーザー/C/M」
  • 「ユーザー/C/F」

したがって、same_city_opp_gender_as を呼び出すたびに、キャッシュが見つからない場合は新しいキャッシュが生成され、キャッシュが存在する場合は値が取得されます。キャッシュの有効期限を考えてhttps://devcenter.heroku.com/articles/building-a-rails-3-application-with-memcacheを読んでください

于 2013-07-28T11:51:42.080 に答える