Rails保持缓存查询而不是查询结果

时间:2012-09-06 10:51:38

标签: ruby-on-rails memcached

我正在尝试根据个人资料的浏览量来列出我主页上的用户。用户是分页的,我试图缓存用户,并在配置文件获得新视图时使该缓存无效。

我的控制器代码:

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页时,我得到了一个预期的缓存未命中,当我刷新时,我得到了一个缓存命中,也正如预期的那样。但是,当我手动通过控制台和刷新页面2更改用户的views时,我在控制台中所做的更改已经影响了页面,即使该页面应该是从缓存中呈现的。顶部的通知仍然说“缓存被击中了。”

在控制台中运行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

我不确定为什么我的控制器代码缓存查询而不是结果。任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

IIRC ActiveRecord现在“懒惰”,你只是缓存查询对象。尝试在User.paginate()之后附加.all以强制sql运行,为您提供一个缓存的结果集。

如果.all失败,请尝试改为.map / .select / .inject。