Memcached和Rails片段缓存问题

时间:2010-05-01 16:19:41

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

当我有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

2 个答案:

答案 0 :(得分:5)

您必须使用唯一的缓存键。如果你简单地传入一个对象,它会调用它上面的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)

答案 1 :(得分:1)

我明白了。

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

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

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

这只是将一个用户密钥附加到posts键,这样如果 更新,则缓存会自动过期。您可以使用相同的约定以明文字符串的形式向密钥添加其他信息。这对于区分绘制相同查询但需要不同视图的片段非常有用,并且是上述问题的答案。

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

然后在另一页上使用

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

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