
ryohei515です。
Ruby on Railsを使う上で、N+1問題は避けては通れない問題です。
インゲージでは週に1度、社内勉強会を行っているのですが、今週は私が発表担当だったため、このN+1問題を知識整理がてら、社内勉強会で共有しました。
簡単な内容ではありますが、その資料をブログで共有したいと思います。
TL;DR
N+1問題に対しては、これが結論です。
| メソッド | 結合方法 | 使用箇所 |
|---|---|---|
| joins | 内部 | 内部結合で結合先の条件をフィルタしたいとき |
| left_joins | 外部 | 外部結合で結合先の条件をフィルタしたいとき |
| preload | 外部 | 結合先のデータを使いたいとき |
| eager_load | 外部 | 結合先のデータを使いたいかつ、 結合先の抽出条件を指定したいとき |
| includes | 外部 | n+1を発生させないようにしたいとき (できれば preload か eager_load を使う。) |
ただ、勉強会では
sizeとcountとlengthの動きはそれぞれ違うよね。- インゲージが提供しているサービス Re:lation だと、
eager_loadとpreload、どっちが早い? - パフォーマンスを意識して
pluckを使っているけど、結果を hash に加工する gem (pluck_to_hash) を使えば、より使いやすくなりそう!
といった感じで色々な話に派生し、学びの多かった勉強会となりました!
終わりに
こんな技術について語り合う場が欲しいと思っている方はぜひご応募頂けると嬉しいです!
カジュアル面談も可能なので、ぜひ以下からお願いします!