左外部結合?内部結合?
外部結合で複数のテーブルを結合してデータを取得させる方法が腑に落ちないため、今回はLEFT OUTER JOINさん特集の会にしております。
それでは、主役のLEFT OUTER JOINさんのプロフィールをご覧ください。
書き方
下記のように、モデル名と関連名をleft_joinsを使って関連づける
# ActiveRecordにおける左外部結合の基本形
モデル名.left_joins(:関連名)
そもそも左外部結合とは
結合したテーブル内のカラムを関連の有無関係なしに取得する指令
もっと簡単に言うと左側のテーブルを基準に結合すること。
- モデル名を親テーブルとして、左に関連名テーブルをくっつけた状態で、モデル名のデータをとってくる。
- ActiveRecordが勝手にモデル名テーブルと関連名テーブルの共通するidでくっつけてくれる。
SELECT `モデル名`.*
FROM `モデル名`
LEFT OUTER JOIN `関連名`
ON `関連名`.`モデル名_id` = `関連名`.`id`
LIMIT 〇〇
left_joinsメソッドの引数には、アソシエーションで定義した関連名を指定する。
例えば犬を飼っている飼い主テーブルとその飼い主に飼われている犬テーブルを書いてみる。
# owner.rb
class Owner < ApplicationRecord
has_many :dogs # 関連名
end
# dog.rb
class Dog < ApplicationRecord
belongs_to :owner # 関連名
end
整理しておきたい「外部結合」と「内部結合」
内部結合:
- 2つのテーブルをくっつけて1つのテーブルっぽくする際のやり方のひとつ。
- 両方のテーブルの合体可能なデータのみを取り出すやり方
外部結合:
- 2つのテーブルをくっつけて1つのテーブルっぽくする際のやり方のひとつ。
- 基準となるテーブルにデータがあれば、もう一方のテーブルになくても取り出すやり方。
- 左のテーブルにしかデータがない場合は、結合先のレコードにNULLが入る
https://wa3.i-3-i.info/diff294db.html
どんな風に使うのか
条件を指定したい場合(モデル名に条件をつける時)
モデル名.left_joins(:関連名).where(カラム名: 値)
条件を指定したい場合(関連名に条件をつける時)
モデル名.left_joins(:関連名).where(結合先のテーブル名: { カラム名: 値 })
なんとなく理解できてきました、、!
「内部結合(INNER JOIN)」と「外部結合(OUTER JOIN)」の違い|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典