我有一个使用俄罗斯玩偶缓存的视图,其中整个项目集合被缓存,集合中的每个项目都在该缓存中单独缓存。
但是,集合中的每个项目都应根据CanCan授予的当前用户权限显示编辑/删除链接。因此,用户A只会在她自己的帖子旁边看到编辑/删除链接,但不会在用户B的帖子旁边看到。
嗯,每当用户A创建一个帖子时,它都会被相应的编辑/删除链接缓存,因为她应该根据她的权限显示它们。但是当用户B查看该集合时,他会为用户A的缓存帖子以及他不应该看到的编辑/删除链接提供服务。当然,CanCan可以防止这些编辑/删除操作发生,但链接仍然存在。
是否存在基于current_user.id创建单个缓存并防止出现(几乎)相同缓存内容版本的大量内容?
答案 0 :(得分:1)
是否存在基于current_user.id创建单个缓存并防止出现(几乎)相同缓存内容版本的大量内容?
您可以包含用户的权限,而不是将用户的ID包含在缓存键中。这仍然会有内容的重复副本,但会根据您的权限模型进行扩展,而不是根据用户数量进行扩展。所以不是典型的:
<% cache("posts/all-#{Post.maximum(:updated_at).try(:to_i)}") do %>
...
<% end %>
您可以创建一个缓存键(假设current_user
返回经过身份验证的用户)并且您只关心编辑与阅读:
<% cache("posts/all-#{Post.maximum(:updated_at).try(:to_i)}-#{current_user.can?(:edit, Post) ? :edit : :read}") do %>
...
<% end %>
请注意,缓存密钥生成应该可以提取到单独的类/辅助方法。