8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【第2回】Railsのjoinsとleft_outer_joinsの挙動と違いをまとめた

Posted at

前回はN+1問題が発生する状況とタイミングについて解説しました。
【第1回】RailsのN+1問題と解決するためのメソッド完全版
もしまだご覧になっていなければ、一読していただけると理解がスムーズになります。

##本記事の内容
今回はN+1問題を解決するメソッドを5つ紹介していきます。

  1. joins
  2. left_outer_joins <=(本記事ではここまで)
  3. eager_load
  4. preload
  5. includes

##joinsメソッド
SQLのINNER JOIN句が発行されます。(内部結合)
内部結合とは、指定したそれぞれのテーブルのカラムの値が一致するデータだけを取得する方法のことです。
内部結合についてはこちらを参考にすると理解しやすいです。
内部結合を行う(INNER JOIN句)

###使い方

例1
モデル名.joins(:関連モデル)

軸となるモデルに対してjoinsメソッドを呼び出し、引数で関連モデルを指定します。

例2
モデル名.joins(:関連モデル)

joinsメソッドは、関連モデルにあるカラムで絞り込みたい場合に使います。

例3
User.joins(:post).where('post.title = ?','ruby')

例3では、UserモデルとPostモデルを結合したうえで、whereメソッド(WHERE句)を使いPostモデルのtitleカラムがrubyの投稿を取得しています。
このように、joinsメソッドは、関連モデルにあるカラムで絞り込みたい場合に使います。

##left_outer_joinsメソッド
SQLのLEFT_OUTER_JOIN句が発行される。
参考:SQLではOUTERを省略し、LEFT JOINと書くこともできる。

###使い方

例1
モデル名.left_outer_joins(:関連モデル)

軸となるモデルに対してleft_outer_joinsメソッドを呼び出し、引数で関連モデルを指定します。

例2
User.left_outer_joins(:post)

left_outer_joinsメソッドは、軸となるモデル(ここでいうところのUserモデル)の全レコードと、関連モデル(Postモデル)の指定した条件にマッチするレコードを取得します。

下記の記事がわかりやすくまとめてあります。
参考:LEFT (OUTER) JOIN (左外部結合)を使ってデータを取得する

例3
User.left_outer_joins(:post).where('post.title = ?','ruby')

joinsメソッドとの大きな違いは、軸となるモデルの全レコードを取得することです。
必要に応じて使い分けるのがよいでしょう。

##まとめ

  • joinsは、内部結合をおこない、指定したそれぞれのテーブルのカラムの値が一致するデータだけを取得する。
  • left_outer_joinsは、軸となるモデルの全レコードを取得し、関連テーブルの条件にマッチしたレコードを取得する。
  • joinsメソッドleft_outer_joinsの違いは、軸となるモデルの全レコードを取得すること。

5つのメソッドすべてを紹介しようと思いましたが、長くなりそうだったためここまでとします。
eager_load以降のメソッドは、joinsやleft_outer_joinsとはまた挙動が変わってくるので、ちょうどいいかなと思います。
それではまた次回、よろしくお願いします!

8
3
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
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?