LoginSignup
3
5

More than 5 years have passed since last update.

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

Posted at

はじめに

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

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5