0

我有这样的剧本。

Search_controller.rb :

def results
   @users = @search.cached_users_count.page(params[:page]).per_page(10)
end

Search.rb 模型:

users = users.order('current_sign_in_at DESC')  


def cached_users_count

    Rails.cache.fetch(["user_count", expires_in: 5.minutes]) { users }

end

我想要做的是缓存所有查询,因为当执行搜索结果后某些用户将登录时,will_paginate 替换下一页上的结果 - 因为刚刚登录的用户位于第一个位置并且结果由 current_sign_in_at 更改

有人可以帮我吗?现在没有缓存,每个搜索结果都有 sql 响应。

4

1 回答 1

2

在您当前的实现中需要更改一些内容以获得您正在寻找的行为。

  1. users您开始使用的对象是返回一个关系,但只返回范围,这意味着它没有按您的预期存储结果。要存储查询结果,您需要使用查询方法加载它们。all在 Rails 3 或Rails 4 中使用if load

    users.order('current_sign_in_at DESC').all  #Rails 3
    users.order('current_sign_in_at DESC').load #Rails 4, all is deprecated
    
  2. 如果您真的希望它过期,Rails 缓存的语法是不正确的。您expires_in作为密钥的一部分传递,这是[]您当前代码中的一个数组。您只想传递普通参数,expires_in作为选项。

    Rails.cache.fetch("user_count", expires_in: 5.minutes) { users }
    

有关 SO 的类似问题,请参见以下内容: Confusion caching Active Record queries with Rails.cache.fetch

于 2013-09-02T10:56:10.510 回答