2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Railsでの joins と includes の違いと使い分け

Last updated at Posted at 2024-10-30

目次

はじめに

Railsのアプリケーション開発では、モデル間の関連性を活用してデータを取得することが多く、その際に利用するのが joinsincludes です。この記事では、データベースから必要な情報を取得する際に使用するjoinsincludesについて、具体的な使い分けとその効果を解説します。

1. joinsとは?

joinsは、内部結合 (INNER JOIN) を使用して、関連するテーブルからデータを取得するためのメソッドです。RailsのActiveRecordでjoinsを使用すると、関連付けされた複数のテーブルを結合してクエリを発行できます。

使用例

以下は、UserモデルとPostモデルを結合する例です。

User.joins(:posts).where(posts: { published: true })

このコードは、投稿が公開されているユーザーを取得します。joinsを使用することで、関連するテーブルの条件を効率的に絞り込むことができます。

特徴

  • 結合条件でフィルタリングができます。
  • 取得されるのは結合されたテーブルのデータだけで、関連オブジェクトは取得されません。
  • N+1問題の解決には不向きです。

2. includesとは?

includesは、関連するテーブルのデータを事前にロードする (Eager Loading) ために使用します。このメソッドを使うことで、N+1問題を回避し、複数のクエリ発行を抑えることができます。

使用例

以下は、ユーザーとその投稿を取得する例です。

User.includes(:posts).each do |user|
  puts user.posts.map(&:title)
end

このコードでは、ユーザーとその関連する投稿が一度のクエリで取得されるため、各ユーザーごとにクエリが発行されるN+1問題を回避できます。

特徴

  • 関連オブジェクトを含めたデータをまとめて取得します。
  • N+1問題の回避に効果的です。
  • 結合条件でのフィルタリングには不向きです。

3. joinsincludesの使い分け

joinsincludesはそれぞれの特徴を理解し、目的に応じて使い分ける必要があります。

joinsを使用する場面

  • 結合条件を使用したフィルタリングが必要な場合
  • 関連するテーブルの一部のデータのみを取得したい場合
  • シンプルな結合が求められるクエリの場合

includesを使用する場面

  • 関連するデータを頻繁に参照する場合
  • N+1問題を回避したい場合
  • 関連オブジェクトをまとめて取得する必要がある場合

4. N+1問題とは?

N+1問題は、関連データを取得する際に対象のレコードごとに追加のクエリが発行され、データベースの負荷が増える問題です。例えば、10人のユーザーそれぞれに関連する投稿を取得する場合、joinsを使わないと11回(1回のユーザー取得 + 10回の投稿取得)のクエリが発行されます。

5. ベストプラクティス

  • 条件付きの結合が必要な場合はjoinsを使用します。
  • N+1問題の回避にはincludesを優先的に使用します。
  • 必要なデータだけを取得するために、selectメソッドと組み合わせます。

6. 組み合わせて使用する例

以下は、joinsincludesを効果的に組み合わせた例です。

users = User.includes(:posts).joins(:comments).where(comments: { spam: false })
users.each do |user|
  puts "#{user.name}: #{user.posts.count} posts"
end

このように、joinsでフィルタリングしつつ、includesでN+1問題を回避することが可能です。

7. まとめ

joinsincludes は、Railsで複数のテーブルからデータを取得する際に不可欠なメソッドです。

  • joins は、内部結合で一致するデータだけを取得したい場合に適しています。
  • includes は、N+1問題を解決し、関連データを一括取得するのに役立ちます。
2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?