【Rails】テーブル結合方法

テーブル結合とは

違うテーブルからそれぞれデータがほしいとき それらを結合して1つのテーブルからデータ取得することができます。

テーブル例

著者が1つ以上の書籍を出版している例を用いて以後説明していきます。

1. 内部結合(INNER JOIN)

基礎構文

モデル.joins(:関連名)

モデル同士の関連付け

class Author < ApplicationRecord
  #「books」が関連名
  has_many :books, dependent: :destroy
end

class Book < ApplicationRecord
  #「authors」が関連名
  belongs_to :author
end

テーブル結合例

authorsテーブルとbooksテーブルをauthor_idを使用して結合する

# selectを省略するとauthorsテーブルの全カラムを取得する
Author.joins(:books).select("books.*,authors.name")

発行sql
SELECT books.*,authors.name FROM `authors` INNER JOIN `books` ON `books`.`author_id` = `authors`.`id`

結合イメージ

2. 外部結合(LEFT OUTER JOIN)

基礎構文

モデル.left_outer_joins(:関連名)

モデル同士の関連付け

内部結合と同じように設定します

テーブル結合例

Author.left_outer_joins(:books).select("authors.*,books.title")

発行sql
SELECT authors.*,books.title FROM `authors` LEFT OUTER JOIN `books` ON `books`.`author_id` = `authors`.`id`

結合イメージ

authorsテーブルにbooksテーブルがくっつくイメージです。

参考

https://style.potepan.com/articles/17010.html https://atmarkit.itmedia.co.jp/ait/articles/1703/01/news186.html

SQL素人でも分かるテーブル結合(inner joinとouter join)