暇人じゃない

Rails.cache.fetch でキャッシュがあったら返す/無かったら生成して返す

Rails.cache(ActiveSupport::Cache) で「キャッシュがあったら返す/無かったら生成して返す」という処理を行いたくて、find_or_cache というメソッドを書いていたりしたのですが、API ドキュメントを読んでいると、Rails.cache.fetch というメソッドで同等の処理ができることが判りました。

ActiveSupport::Cache::Store
http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html#method-i-fetch

基本的に API ドキュメントに書いてある通りですが、以下のように書けます:

Rails.cache.fetch('Hatsune') do
  'Miku'
end
# => "Miku" 

fetch を使用しない場合は、大体以下のように書くのではないかなと思います(クールな書き方があったら教えてください!) :

cache_key = 'Hatsune'

cache = Rails.cache.read(cache_key)
return cache unless cache.nil?

data = 'Miku'

Rails.cache.write(cache_key, data)

data

Cache Store には Dalli を使用していますが、Dalli も fetchサポートしています。

だいぶ簡単に書けるようになりましたね。

では、今年もよろしくお願いします。