nagurigakinの日記

日常、技術系を。気合い入れると続かないのでゆるふわ。

Railsキャッシュの手法

読み込みがあまりにも遅いページがあったので、初めてキャッシュを導入しようとした時のめもです。

キャッシュの手法は 3つあり、

1, ページキャッシュ (ページごとのキャッシュ)
2, アクションキャッシュ (アクションごとのキャッシュ)
3, フラグメントキャッシュ (部品(header, each文等)ごとのキャッシュ)

これだけ覚えておけばよさそう。

今回はindexアクションが遅いということで、
はじめに2のアクションキャッシュを使用してみました。

gem 'actionpack-action_caching'
bundle install

※development環境でもキャッシュを有効にするためにdevelopment.rbの以下をtrueに変更

config.action_controller.perform_caching = true

遅いと原因となっているcontrollerに caches_action :index を追記した。

class SampeController < ApplicationController
  caches_action :index
  def index
  end
end

これでページをリロードしてみた。
...
1回目はキャッシュがまだないので当然遅かったが、2回目にかなり早くなって成功!!簡単じゃん。
と自惚れていたら。。。

データを更新してもキャッシュが読み込まれてしまって、変更が反映されていませんでした。。
アクションキャッシュでページの更新を検知し、変更があればキャッシュを書き換える方法もあるとどこかで見ましたが、なんかめんどそうなので、今回は不採用に。




そこでもっと簡単な方法はないかと検索していると、上記3の方法がよしなに変更を検知してくれるらしいとの情報を見つけたので、試してみました(しかもgemが不必要)。

renderに cached: trueを追記

= render partial: "samples/sample", collection: @pending_relations.includes(:influencer, :campaign), cached: true

render先のviewを cache do で囲う

- cache sample do

すると、2回目の表示速度が早くなり、データ更新するとしっかりと反映されるようになりました!