【问题标题】:Memcached and Rails Fragment Caching IssueMemcached 和 Rails 片段缓存问题
【发布时间】:2010-05-01 16:19:40
【问题描述】:

当我有 2 个片段缓存相同查询但以不同方式显示它们的视图时,只有一个片段并且它们都以相同的方式显示。有没有办法解决?比如……

#views/posts/list
    - cache(@posts) do
         - for p in @posts
              = p.title

#views/posts/list_with_images
    - cache(@posts) do
         - for p in @posts
              = p.title
              = p.content
              = image_tag(p.image_url)

#controllers/posts_controller
     def list
        ...
        @posts = Post.all
     end

     def list_with_images
        ...
        @posts = Post.all
     end

【问题讨论】:

    标签: ruby-on-rails ruby caching memcached fragment-caching


    【解决方案1】:

    您必须使用唯一的缓存键。如果您简单地传入一个对象,它会在其上调用cache_key 方法来确定密钥。如果传入一个对象数组,cache 将通过加入数组所有元素的缓存键来生成一个键。您可以通过以下方式解决您的问题:

    #views/posts/list
        - cache([:list, @posts]) do
             - for p in @posts
                  = p.title
    
    #views/posts/list_with_images
        - cache([:list_with_images, @posts]) do
             - for p in @posts
                  = p.title
                  = p.content
                  = image_tag(p.image_url)
    

    【讨论】:

      【解决方案2】:

      我想通了。

      首先,这个策略的重点是利用 rails 中的智能缓存键,它会根据模型名称、ID 和 updated_at 属性自动生成唯一键。

      如果您的内容涉及两个模型怎么办?这个内置有一个约定,你只需使用一个数组:

      - cache([@posts, @user]) do
      

      这只是将用户键附加到帖子键,因此如果 either 更新,缓存会自动过期。您可以使用相同的约定以纯字符串的形式向密钥添加附加信息。这对于区分基于相同查询但需要不同视图的片段很有用,并且是上述问题的答案。

      - cache([@posts, "lists"]) do
      

      然后在另一个页面上使用

      - cache([@posts, "list_with_images"]) do
      

      这将创建两个不会相互混淆的独立片段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-25
        • 2011-09-01
        • 2010-11-22
        • 2010-11-05
        • 2010-09-20
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        相关资源
        最近更新 更多