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

このように、複数の関連を指定することで、さらに効率的にデータを取得できます。

includeseager_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を使うと、パフォーマンスが大幅に向上します。
  • includeseager_loadは似ているものの、使用するシチュエーションに違いがあります。

Ruby on Railsのincludesメソッドを使いこなすことで、データベースの効率的なアクセスが可能になります。是非、実務のプロジェクトで活用してみてください。

Rubyをマスターしよう

この記事で学んだRubyの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。