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)
我知道我們需要知道我們試圖訪問哪個帖子來獲得正確的緩存。但實際上,如果我做模型緩存(Rails.cache.fetch(){Myquery})而不是片段緩存,我可以檢查緩存是否存在,只有在不存在時觸發查詢。但是這比片段緩存和自動過期更復雜。每篇關於片段緩存的文章都將這種例子用於cache @ the-object-you-cache,但不討論查詢。你的觀點是告訴查詢是不可避免的,但是緩存對於渲染時間的獲得還是有用的。 – 2014-08-27 15:24:01
可能取決於。你的數據庫調用只有1.2毫秒,你的視圖需要4.8毫秒。我認爲我不會爲這樣的事情進行緩存而煩惱,但它可能是你正在使用一個簡化的例子。數據庫調用不會改變(除非需要更多的數據庫調用) - 視圖可能變得更加複雜,在這種情況下,您可能會發現通過緩存保存的時間變得值得。 – dax 2014-08-27 15:51:30