2010-05-01 86 views
0

当我有2个视图片段缓存相同的查询,但显示它们不同,只有一个片段,他们都显示相同的方式。有没有办法解决?例如...Memcached和Rails片段缓存问题

#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 

回答

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

我想通了。

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

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

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

而这只是一个附加用户关键岗位的关键,因此,如果要么更新缓存自动失效。您可以使用相同的约定以简单字符串的形式向密钥添加附加信息。这对区分使用相同查询但需要不同视图的片段很有用,并且是上述问题的答案。

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

,然后在其他页面使用

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

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