0

在我的用户索引操作中,我正在运行一个查询,该查询查找与 同一个城市current_user和异性的所有用户,并按顺序对结果进行profile_update_at排序DESC。查询工作得很好。该应用程序目前在 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

此外,用户类必须提供城市和性别方法。对于 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 回答