テーブル結合の方法!Ruby on Railsのjoinの使い方【初心者向け】

Ruby on Railsで使うjoinメソッドの使い方について解説しています。joinはテーブルの結合を行う際に利用します。今回は内部結合を実際に書きながら説明しているので初心者でもすぐに理解できるはずです。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

RubyのフレームワークのRailsには、テーブル結合を行うためのメソッドjoinが用意されています。今回はテーブル結合の基礎と実際にRailsで行う際のコードを解説したいと思います。

 

なお本記事は、TechAcademyのWebアプリケーションオンラインブートキャンプの内容をもとに紹介しています。

 

田島悠介

ここではRuby on Railsのjoinについて解説するよ。

大石ゆかり

田島メンター!!joinメソッドは何をするんですか〜?

田島悠介

joinはテーブル同士を結合するときに使うんだ。結合には内部結合と外部結合があるんだけれど、今回は内部結合について勉強しよう。

大石ゆかり

分かりました!

 

テーブル結合とは

二つのテーブルを何らかの方法で一つのテーブルに結合する事。テーブルはRailsでいうと主にModelの事です。またテーブル結合は結合の方法によって二種類に分けられます。今回はその内の「内部結合」という方法についてのみ解説します。

 

内部結合

内部結合とは二つのテーブルから同じカラムだけを取得する方法です。SQL分で表すと以下のようになります。

SELECT *
  FROM テーブルA INNER JOIN 結合したいテーブルB
    ON テーブルA.カラム = 結合したいテーブルB.カラム

また、一致するカラムが複数あった場合、どちらのカラムも取得されます。

 

大石ゆかり

内部結合というのは、どういった形になるんでしょうか?

田島悠介

両方のテーブルの、どちらにも共通するキーだけを残す方法だよ。

大石ゆかり

なるほど、それ以外は取得しないってことですね。

 

Railsで内部結合を扱ってみよう

今回はUserモデルとAvatarモデルについて結合を行ってみたいと思います。モデルの要素は以下の通りです。

User
:id
:name
:email
Avatar
:id
:bookname

この二つのモデルを結合してみたいと思います。

User.joins(:avatar)
=>
SELECT users.* 
  FROM users INNER JOIN avatars
    ON avatars.id = users.id AND avatars.bookname = 'User'

これでモデルの結合は完了となります。

 

ただjoinsには難点があり

user = User.joins(:avatar).find_by(id: 1) 
user.name = "山田太郎"
user.save

としてもセーブが出来ません。

user = User.joins(:avatar).readonly(false).find_by(id: 1) 
user.name = "山田太郎"
user.save

このようにreadonly(false)を行うことによってセーブを行うことができます。

 

今回はjoinの使用法とテーブル結合を行う方法を解説しました。joinを行うことによって、モデルの探索などを簡単に行うことが可能となります。是非使いこなせるようになりましょう。

 

田島悠介

内部結合の場合は、両方に共通したものだけが残るのでお互いの順番は関係ないことになるね。

大石ゆかり

確かにそうですね。

田島悠介

これに対して外部結合は共通していないキーも残す方法なんだけれど、こちらは順番によって残る要素が変わってくるようになるよ。

大石ゆかり

色々な種類の結合方法があるんですね。ありがとうございました!

 

[お知らせ]TechAcademyでは初心者でも8週間でエンジニアになれるRuby on Railsオンラインブートキャンプを開催しています。RubyでWebアプリを開発したい方はご参加ください。