皆様お久しぶりです、プレイライフの熊崎です!
最近体調を崩すことが多く、アウトプットができておりませんでした。
体調を崩していた私が言うのもどうかとは思いますが、季節の変わり目ですので体調管理には気をつけましょう!
というわけで、久々のアウトプットを行っていきたいと思います。
joinsメソッド
内部結合を行うメソッド。
内部結合
結合とは?
SQLで、このような複数のテーブルに格納されたデータを集めた表を作る処理を「結合」と呼びます。
ref: https://style.potepan.com/articles/17010.html
内部結合とは?
結合にもいくつか種類があり、その中の一部。
INNER JOINは、結合するテーブルのデータのうち、条件に指定したカラムの値が一致するデータのみを結合します。
ref: https://style.potepan.com/articles/17010.html
例: 書籍(books)テーブルと著者(authors)テーブルを内部結合する。
booksテーブル
id | title | authors_id |
---|---|---|
1 | 猿でもわかるRuby on Rails | 1 |
2 | 猿でもわかるSQL | 1 |
3 | 猿でもわかるRuby | 2 |
authorsテーブル
id | name |
---|---|
1 | 佐藤太郎 |
2 | 鈴木次郎 |
3 | 田中三郎 |
結合後のテーブル
id | title | authors_id | id | name |
---|---|---|---|---|
1 | 猿でもわかるRuby on Rails | 1 | 1 | 佐藤太郎 |
2 | 猿でもわかるSQL | 1 | 1 | 佐藤太郎 |
3 | 猿でもわかるRuby | 2 | 2 | 鈴木次郎 |
このように、2つのテーブルが結合する。
注意点としては、田中三郎さんが書いた書籍はbooksテーブルに存在しない(→ author_id = 3のレコードが存在しない)場合は、結合後のテーブルには表示されない。
内部結合のSQL文
SQL文は以下のように書く。
SELECT * FROM books
INNER JOIN authors
ON books.author_id = authors.id;
もっと抽象的に説明すると、以下のような書き方をする。
SELECT * FROM 結合元のテーブル
INNER JOIN 結合したいテーブル
ON 結合条件;
railsのjoinsメソッドはどのような挙動を示すのか?
先ほどの書籍テーブル、著者テーブルの例を使用する。
class Book < ApplicationRecord
belongs_to :author
end
class Author < ApplicationRecord
has_many :books
end
Book.joins(:author) # => ちなみに、joinsの中身は生のSQLでも可
# 以下のSQLを生成する。
# SELECT * FROM books
# INNER JOIN authors
# ON books.author_id = authors.id;
まとめ
- 内部結合は、結合するテーブルのデータのうち、条件に指定したカラムの値が一致するデータのみを結合する。
- railsのjoinsメソッドは内部結合のSQL文を生成する。
参考文献
https://railsguides.jp/active_record_querying.html#joins
https://style.potepan.com/articles/17010.html
最後に
フレームワークはとても便利ですが、反面何をやっているか見えにくいところもあるので、今後もフレームワークの裏側ではどのような処理が行われているのかまでしっかりと理解していきたいと思います。