作ったgemはこれです。
使い方
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" }