在我的用户索引操作中,我正在运行查询,该查询会查找与current_user
属性相同的所有用户以及异性,并在profile_update_at
中按DESC
对结果进行排序订购。查询工作得很好。该应用目前正在3个城市运行。因此,来自A市的每个男性基本上都在运行相同的查询,对于来自A市的女性也是如此。
我希望能够将此查询缓存大约5分钟。我怎样才能做到这一点?我应该使用什么类型的缓存?由于查询取决于current_user
的城市和性别,因此从城市A为用户创建的缓存是否会干扰用户从城市B的查询?或者,将为City B中的用户创建新缓存。
答案 0 :(得分: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
此外,用户类必须提供城市和性别方法。 对于3个城市(A,B,C)和2个性别(M,F),您将获得6个带有以下键的缓存:
因此,每次调用same_city_opp_gender_as都会在未命中时生成新缓存,或者在缓存存在时获取值。考虑缓存过期并阅读https://devcenter.heroku.com/articles/building-a-rails-3-application-with-memcache