Rails избегает запросов с фрагментным кэшированием при базовом действии show
Я играю с фрагментным кэшированием, я прочитал руководство и посмотрел Railscast.
Я пытаюсь сделать фрагмент кеширования в базовом действии шоу:
контроллер:
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 %>
Проблема: хотя фрагмент собран и прочитан (см. Журналы ниже), база данных все еще поражена. Это нормальное поведение?
Я подозреваю, что фильтр перед действием запускает запрос перед чтением кэша.
Я подозревал дружественную систему идентификаторов, но запрос также происходит с классической находкой.
Как я должен кешировать это, чтобы избежать запроса?
Журналы:
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)
1 ответ
Если ваше приложение не имеет только одного поста, я действительно не думаю, что вы захотите кэшировать первый вызов - кэширование фрагментов будет кэшировать данный пост, но ему все равно нужно знать, к какому посту обращаются.
Если вы кешируете это, каждый раз, когда вы загружаете страницу поста # шоу, независимо от того, какой пост вы запросили, вы увидите один пост - пост, который был кэширован.