
こんにちは、現役沖縄フリーランスエンジニアのmah(MaLanka)です。
このブログでは、
僕がIT未経験から約1年でフリーランスエンジニアになるまでの過程、
ノウハウなどを書いていきます。
今回は、
- 【Rails】partialのcollectionをcacheし、有効期限(expires_in)を設定する方法
について書いていきます。
【Rails】partialのcollectionをcacheし、有効期限(expires_in)を設定する方法
結論、
下記のような感じになります。
<%= render partial: 'shared/users_info', collection: User.all, cached: true, expires_in: 10.minutes %>
やり方としては、
cache オプションと expires_in オプションを指定するだけなのですが、
生成されるキャッシュのキーについて補足しておきます。
生成されるキャッシュのキーについて
- shared/users_info.html.erbというパーシャルがあるとします。
<%= render partial: 'shared/users_info', collection: User.all, cached: true, expires_in: 10.minutes %>
これで生成されるキャッシュのキーは下記のような感じになります。
ビューファイルのパス:ビューファイルの更新日時から生成される一意でランダムな32文字/Userインスタンスのidとupdated_atから生成された文字列
キャッシュのキーをカスタマイズする場合
# (例えばの話)Userインスタンスのname属性をキャッシューのキーにしたい場合
# ->(user)には、User.allの中身が引数として渡ってくる
<%= render partial: 'shared/users_info', collection: User.all, cached: ->(user) { user.name }, expires_in: 10.minutes %>
これで生成されるキャッシュのキーは下記のような感じになります。
ビューファイルのパス:ビューファイルの更新日時から生成される一意でランダムな32文字/Userインスタンスのname
以上です。
参考
- Cached partial collections renderer is broken for cached, expiring partials; doesn't support expires_in
- Fix issue with cached partial collections
- Ruby on Rails のフラグメントキャッシュのキャッシュキーはどのように決まるか