【Rails入門】joinsの使い方まとめ

こんにちは! フリーエンジニアの長瀬です。

みなさん、joinsは使っていますか?

joinsを使えば、テーブルの内部結合が簡単できます。

この記事では、joinsの使い方について

・joinsの基本

という基本的な内容から、

・joinsのさまざまな使い方

といった応用的な内容についても解説していきます。

joinsの基本

joinsとは

joinsテーブル同士を内部結合して検索するためのメソッドです。

内部結合とは、各テーブル同士で関連づけられたidが一致しているものだけを使って新しいテーブルを作ることです。

なので、idが一致しないものは切り捨てられます。

テーブルがいくつかに分けられている場合、1つ1つから必要なデータを見つけるよりも、テーブルを1つにまとめてから見つけるほうが楽ですよね?

なので、結合してから検索することを可能にするメソッドが用意されているわけです。

結合の種類には内部結合のほかに、左外部結合右外部結合があります。

内部結合が一致したものだけで新しいテーブルを作るのに対して、外部結合では優先テーブルを選択して結合することができます。

なので、優先したテーブルのデータは切り捨てられません。
優先したテーブルにしかないデータに対応する部分はNULLになります。

たととば、以下のような2つのCastleテーブルとOwnerテーブルがあったとします。

Castleテーブル
castletable

Ownerテーブル
Ownertable

これを内部結合すると、
innerJointable

このように、owener_idが一致するものだけが、表示されます。
onwer_idが一致しなかった首里城は切り捨てられました。

Castleテーブルを優先して外部結合すると

Screen Shot 2560-07-12 at 15.28.42

このように優先されたテーブルはすべて表示され、対応する部分がない場合にはNULLになります。(この場合owner_id 4には対応するものがない)

joinsとincludesの違い

joinsとincludesの違いについては以下の記事にまとめてありますので、こちらを参考にしてください。

joinsのさまざまな使い方

結合したテーブルの値を取得する方法

まずはテーブルを作成します。
こちらのコードをコマンドプロンプトに入力してテーブルを作成してください。

これでnameのカラムを持つUserテーブルとuser_id、title、monthカラムを持つPostデーブルが作成されます。

次に実際にデータを入れていきます。
rails consoleでコンソールを起動し、以下のコードをコピペしてください。

各テーブルに必要なデータが入りました。

次にUser、Postテーブルを関連付けます。
models/user.rbに

models/post.rbに

をそれぞれ入力してください。

これで、準備が整いました。

実際にjoinsを使っていきましょう。

とその前にここからはrails cosoleに取り出したデータを出力していくので
出力したデータの見栄えを良くにするために一つgemを追加します。
(すでにインストール済みの方は飛ばしてもらってかまいません。)

まず、Gemfileに

を追記して、
コマンドプロンプトで

を入力してインストールしてください。

そして最後にrails consoleでコンソールを開いた後、

と入力して、hirbのgemを有効にします。

これで出力の準備は完了です。

それではjoinsを使ってみましょう。
rails consoleでコンソールを起動した後、以下のコードを入力してください。

[joinsを使ったサンプルコード]

[実行結果]

このように、idが一致しているカラムだけが取り出されて、そのほかは切り捨てられました。

例えば、Post.create(user_id:8,title:"最近少し気になったこと" ,month:1)のコマンドで入力したデータのidは8ですが、それに対応するidがUserテーブルにはないので、内部結合では表示されません。

また、joinsでselectメソッドを使うことによって、特定のカラムを選択して表示できます。

rails consoleでコンソールを起動した後、以下のコードを入力してください。

[joins+selectを使ったサンプルコード]

[実行結果]

select(カラム名.テーブル名)で、特定のカラムだけを選んで表示できました。

検索条件を設定する方法

joinsとwhere句を組み合わせることによって、内部結合した後に条件を指定してデータ取り出せます。

rails consoleでコンソールを起動した後、以下のコードを入力してください。

[joins+where句を使ったサンプルコード]

[実行結果]

Post.create(user_id:1,title:"楽しい休日の過ごし方" ,month:8)
Post.create(user_id:3,title:"山登りに行きました" ,month:8)

で追加したデータのmonthは両方とも8なので、この2つが取り出されました。

このように、where句を使うことによって条件を指定できます。

joinsにて外部結合を実現する方法

rails4以前の方法

joinsは内部結合であると説明しましたが、実は書き方によっては左外部結合にもできます。

rails consoleでコンソールを起動した後、以下のコードを入力してください。

[joinsで左外部結合をするサンプルコード]

[実行結果]

LEFT OUTER JOINの部分で左外部結合を実現しています。

優先テーブルはUserなので、Userテーブルのカラムが優先して表示されます。

rail5にて追加された新たな方法

またrails5からはleft_outer_joinsというメソッドが追加されて直接SQL文を書かなくても左外部結合できるようになりました。

rails consoleでコンソールを起動した後、以下のコードを入力してください。

[生のSQL文を使わずにjoinsで左外部結合するサンプルコード]

[実行結果]

User.joins("LEFT OUTER JOIN posts ON users.id = posts.user_id”)を用いた時と同じ結果になることが確認できます。

なので、Rails5以降を使っている場合はこちらのメソッドを使うようにしてください。

まとめ

いかがでしたでしょうか?

この記事では、joinsの使い方を解説しました。

joinsを使うことで、テーブル同士を内部結合してからデータを取り出せます。

テーブルを結合する際には、joinsの他にpreload,eager_load,includesがあります。

それぞれのメソッドを組み合わせて使うことが多いので、それぞれの特性を理解したうえで、組み合わせて使っていきましょう。

もしjoinsの使い方について忘れてしまったらこの記事を確認してくださいね!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

長瀬来

長瀬来

Unityを使ったiOSアプリのリリース、フリマサイト運営の経験があります。

経験した言語はC、C#、Javascript、R、Python、Ruby、PHPなど

言語が好きで、英語や中国、ドイツ語を勉強しました。
将来的には海外で生活したいです。

現在はRuby on Rails5やCocos2dxの勉強を主にしています。

ライターとしては
できるだけ初心者にわかりやすい文章になるように心がけています。

趣味は語学、読書です。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説