ActiveRecordでRails.cacheを良い感じに使うgemを作った

作ったgemはこれです。

github.com

使い方

ApplicationRecord でモジュールを include してください。

class ApplicationRecord < ActiveRecord::Base
  include ActiveRecordInCache::Methods

  self.abstract_class = true
end

自動的に maximum(:updated_at) を使ったキャッシュキーを生成し、2回目以降は Rails.cache からオブジェクトを取り出します。

Article.all.in_cache
# SELECT MAX("articles"."updated_at") FROM "articles"
# SELECT "articles".* FROM "articles"
#=> [#<Article:0x0000000000000000>, ...]

Article.all.in_cache
# SELECT MAX("articles"."updated_at") FROM "articles"
#=> [#<Article:0x0000000000000000>, ...]

実装について

中身は3行しかありません。

def in_cache(column = :updated_at, options = {}, &block)
  value = block_given? ? all.instance_exec(&block) : all.maximum(column)
  name = "#{all.to_sql}_#{value}"
  Rails.cache.fetch(name, options) { all.to_a }
end

キャッシュのキーは #{sql}_#{maximum_updated_at} になります。

あと、ブロックを使えるようにしてあるので、maximum 以外の処理にしたり、suffixをつけることができます。

Article.all.in_cache { "#{maximum(:updated_at)}_v2" }