tusbasaのブログ

業務や勉強中に調べたことを自分用にメモするブログ

【rails】パフォーマンス改善

N+1問題を解消するにはincludeメソッドを使う。

#TaskモデルにCategoryとUserモデルが紐づいている場合
@tasks = Task.includes(:category, :users).order(id: :desc).page(params[:page]).per(200)


小テーブルのレコードを最初にすべて取っておいてハッシュの形で使うこともできる

#TaskモデルにCategoryとUserモデルが紐づいている場合
@tasks = Task.includes(:users).order(id: :desc).page(params[:page]).per(200)
@categories = Category.all.pluck(:id, :name).to_h

#[ [id_1, name_1], [id_2, name_2] ]   pluckで配列を作る
#{ id_1 => name_1, id_2 => name_2 }  to_hでハッシュに変換

#以下のように取り出すことができる
@categories[task.category_id]


データ数の多いハッシュをキャッシュしておくとサーバーのメモリが圧迫される為注意が必要。