我正在玩片段缓存,我已阅读指南并观看了railscast。
我试图在基本的show动作上做一些片段缓存:
控制器:
class PostsController < ApplicationController
before_action :set_post, only: [:show]
def show
end
private
# Use callbacks to share common setup or constraints between actions.
def set_post
@post = Post.friendly.find(params[:id])
# @post = Post.find(params[:id])
end
end
查看:
<% cache @post do %>
<h1><%= @post.title %></h1>
<%= @post.content %>
<% end %>
问题:虽然片段是构建和读取的(参见下面的日志),但数据库仍然被命中。这是正常行为吗?
我怀疑之前的操作过滤器在读取缓存之前触发查询。
我怀疑友好的id系统,但查询也发生在经典的查找中。
我应该如何缓存此内容以避免查询?
日志:
Started GET "/articles/article-3" for 127.0.0.1 at 2014-08-27 10:05:14 -0400
Processing by PostsController#show as HTML
Parameters: {"id"=>"article-3"}
Post Load (1.2ms) SELECT "posts".* FROM "posts" WHERE "posts"."slug" = 'article-3' ORDER BY "posts"."id" ASC LIMIT 1
Cache digest for app/views/posts/show.html.erb: 18a5c19e6efef2fd1ac4711102048e1c
Read fragment views/posts/3-20140730194235000000000/18a5c19e6efef2fd1ac4711102048e1c (0.5ms)
Rendered posts/show.html.erb within layouts/application (4.8ms)
答案 0 :(得分:1)
除非您的应用程序只有一个帖子,否则我真的不想要缓存第一个调用 - 片段缓存会缓存给定的帖子,但它仍然需要知道正在访问哪个帖子。
如果您确实对此进行了缓存,那么每次加载帖子#show页面时,无论您要求的帖子是什么,您都会看到一个帖子 - 缓存的帖子。