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 回答