Posted at

memoistでメモ化と、ActiveRecordのクラスメソッドをメモ化する方法

More than 3 years have passed since last update.


はじめに

Railsでマスター系のDBで何度も同じ内容を叩いたり、N+1問題対策でincludesをつけていても、結局

デカイSQLを発行してしまい効率的ではない場合もある

そこでメモリに保存して再利用する方法memoistを使う方法がある

※Low-Level Cachingを使う場合がある

ActiveRecordのクラスメソッドでメモ化する場合はちょっとコツがあったので共有したい


検証環境


  • OS: MacOSX 10.10

  • Rails version: 4.2

  • memoist version: 0.12.0


サンプルコード

class SampleCode < ActiveRecord::Base

# レコードが更新されたらキャッシュしてるメモを破棄
after_commit :flush_cache

# クラスメソッドの場合はこんな感じで破棄する
def flush_cache
self.class.flush_cache
end

#キャッシュされるSampleCodeモデルのコード群
@@cached_codes = [AAA, BBB, CCC, DDD, EEE].map!(&:freeze).freeze

# クラスメソッドのメモ化
# def self.plan_idsといつもどおりにかけないので注意
class << self
extend Memoist
def plan_ids
SampleCode(code: @@cached_codes).pluck(:id)
end
memoize :plan_ids
end
end


refs

クラスメソッドをフラッシュする方法

https://github.com/matthewrudy/memoist/issues/13

はらパンさんの記事

http://j-caw.co.jp/blog/?p=1427