【问题标题】: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
这将创建两个不会相互混淆的独立片段。