代码之家  ›  专栏  ›  技术社区  ›  user1650177

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

  •  1
  • user1650177  · 技术社区  · 12 年前

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

    我的控制器代码:

    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
    

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

    1 回复  |  直到 12 年前
        1
  •  0
  •   eevar    12 年前

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

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