当我有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
答案 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
这将创建两个不会相互混淆的独立片段。