2014-08-27 67 views
3

我正在玩片段緩存,我已閱讀指南並觀看了railscast。Rails在基本顯示操作中避免使用片段緩存的查詢

我試圖做一個基本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 %> 

問題:而片段是構建和讀取(請參閱下面的日誌)數據庫仍然命中。這是一個正常的行爲?

我懷疑之前的操作過濾器觸發查詢緩存讀取之前。

我懷疑友好的身份證系統,但查詢發生在經典的發現。

我該如何緩存這個以避免查詢?

日誌:

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#show頁面,無論你要求什麼帖子,你都會看到一個帖子 - 緩存的帖子。

+0

我知道我們需要知道我們試圖訪問哪個帖子來獲得正確的緩存。但實際上,如果我做模型緩存(Rails.cache.fetch(){Myquery})而不是片段緩存,我可以檢查緩存是否存在,只有在不存在時觸發查詢。但是這比片段緩存和自動過期更復雜。每篇關於片段緩存的文章都將這種例子用於cache @ the-object-you-cache,但不討論查詢。你的觀點是告訴查詢是不可避免的,但是緩存對於渲染時間的獲得還是有用的。 – 2014-08-27 15:24:01

+0

可能取決於。你的數據庫調用只有1.2毫秒,你的視圖需要4.8毫秒。我認爲我不會爲這樣的事情進行緩存而煩惱,但它可能是你正在使用一個簡化的例子。數據庫調用不會改變(除非需要更多的數據庫調用) - 視圖可能變得更加複雜,在這種情況下,您可能會發現通過緩存保存的時間變得值得。 – dax 2014-08-27 15:51:30

相關問題