0

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

2 回答 2

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)
于 2010-05-01T17:01:23.033 回答
1

我想到了。

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

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

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

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

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

然后在另一个页面上使用

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

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

于 2010-05-01T16:46:42.413 回答