Ruby on RailsのIncludesとは?初心者向けにわかりやすく解説
はじめに
Ruby on Railsを学び始めたばかりの方にとって、ActiveRecordを使ったデータの取得方法に戸惑うことが多いでしょう。その中でも、includes
メソッドはパフォーマンスを向上させるための重要な手段です。今回は、このincludes
メソッドについて、初心者にもわかりやすく解説します。
この記事を読むとわかること
- Ruby on Railsにおける
includes
メソッドの基本 includes
を使ってN+1問題を解決する方法includes
を実際のコード例で理解する方法
Ruby on Railsのincludes
メソッドとは?
includes
メソッドは、RailsのActiveRecordにおける「Eager Loading(事前読み込み)」を実現するために使われます。これを使うことで、関連するデータを一度に読み込むことができ、データベースへのアクセス回数を減らすことができます。
例えば、ブログ記事とそのコメントを取得する場合、通常の書き方では、記事を取得した後にコメントを取得する別のクエリが発行されます。これがN+1問題を引き起こす原因です。しかし、includes
を使うことで、コメントも一緒に事前に読み込むことができ、クエリを最小限に抑えることができます。
includes
の基本的な使い方
まずは、基本的なincludes
の使い方を紹介します。以下のコードを見てください。
# ArticleモデルがCommentモデルと関連している場合 articles = Article.includes(:comments).all
このコードでは、すべての記事と、それに関連するコメントを一度のクエリで取得しています。これにより、N+1問題を防ぐことができます。
N+1問題とは?
N+1問題とは、あるオブジェクトの関連するオブジェクトを個別に取得することで、不要なSQLクエリが複数発行される現象です。例えば、100件の記事があった場合、各記事に関連するコメントを取得するために、100回のSQLクエリが発行されることになります。これがN+1問題です。
以下のコードでは、N+1問題を引き起こします。
# コメントを個別に取得している場合 articles = Article.all articles.each do |article| puts article.comments.count end
このように、記事ごとにコメントを個別に取得すると、クエリが増えてパフォーマンスが低下します。
includes
を使ってN+1問題を解決する
次に、includes
を使って上記の問題を解決する方法を見ていきましょう。
# `includes`を使って関連するコメントを事前に読み込む articles = Article.includes(:comments).all articles.each do |article| puts article.comments.count end
このコードでは、includes
メソッドを使って、記事とそのコメントを一度に取得しています。これにより、SQLクエリは1回だけで済み、パフォーマンスが向上します。
includes
の使い方の応用
includes
は、関連するモデルだけでなく、複数の関連モデルを一度に読み込むこともできます。例えば、記事とそれに関連するコメントだけでなく、ユーザー情報も一度に取得する場合は、次のように書けます。
# 複数の関連を一度に読み込む articles = Article.includes(:comments, :user).all
このように、複数の関連を指定することで、さらに効率的にデータを取得できます。
includes
とeager_load
の違い
includes
メソッドと似たようなメソッドに、eager_load
があります。両者は似ていますが、使用する場面に違いがあります。
includes
: デフォルトでは、関連を別のクエリで読み込みますが、特定の条件下では結合(JOIN)を使うこともあります。eager_load
: 明示的に関連をJOINで読み込む場合に使用します。特に、条件付きでデータを取得する場合に有効です。
例えば、次のように使います。
# `eager_load`を使ってJOINを明示的に行う articles = Article.eager_load(:comments).where(comments: { approved: true })
このコードでは、コメントが承認されたもののみを取得していますが、eager_load
を使うことで、JOINを使って一度に関連データを取得できます。
まとめ
includes
は、関連するデータを効率的に事前に読み込む方法です。- N+1問題を解決するために
includes
を使うと、パフォーマンスが大幅に向上します。 includes
とeager_load
は似ているものの、使用するシチュエーションに違いがあります。
Ruby on Railsのincludes
メソッドを使いこなすことで、データベースの効率的なアクセスが可能になります。是非、実務のプロジェクトで活用してみてください。