2014-08-27 2 views
3

Я играю с кэшированием фрагментов, я прочитал руководства и посмотрел 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

Если ваше приложение имеет только один пост, я действительно не думаю, что вы хотите кэшировать первый вызов - фрагмент кэширования будет кэшировать данный пост, но он по-прежнему необходимо знать к которой относится доступ.

Если вы сделали кеш этого, каждый раз, когда вы загружали страницу # post, независимо от того, что вы просили, вы увидите одно сообщение - сообщение, которое было кэшировано.

+0

Я понял, что нам нужно знать, к какому сообщению мы пытаемся получить доступ, чтобы получить правильный кеш. Но на самом деле, если я делаю кэширование модели (Rails.cache.fetch() {Myquery}) вместо кэширования фрагментов, я могу проверить, существует ли кеш и запускать запрос, только если это не так. Но это сложнее, чем кеширование фрагментов и автоматическое выключение. Каждое сообщение, которое я прочитал о кешировании фрагментов, использует этот пример с кешем @ the-object-you're-caching, но не говорит о запросе. Ваша задача - сказать, что запрос неизбежен, но кэширование по-прежнему полезно для увеличения времени рендеринга? –

+0

возможно, это зависит. ваш вызов db всего 1,2 мс, ваше представление занимает 4,8 мс. Я думаю, что я не стал бы кэшировать что-то вроде этого, но, возможно, вы используете пример с уменьшенными возможностями. Вызов базы данных не изменится (если от него больше не требуется) - представление может стать более сложным, и в этом случае вы можете обнаружить, что время, которое вы сохраняете при кэшировании, стоит того. – dax

Смежные вопросы