我正在尝试根据个人资料的浏览量来列出我主页上的用户。用户是分页的,我试图缓存用户,并在配置文件获得新视图时使该缓存无效。
我的控制器代码:
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
我不确定为什么我的控制器代码缓存查询而不是结果。任何建议都将不胜感激。
答案 0 :(得分:0)
IIRC ActiveRecord现在“懒惰”,你只是缓存查询对象。尝试在User.paginate()之后附加.all以强制sql运行,为您提供一个缓存的结果集。
如果.all失败,请尝试改为.map / .select / .inject。