はじめに
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