LoginSignup
1
1

More than 1 year has passed since last update.

railsのjoinsメソッドは何をやっているのか?

Posted at

皆様お久しぶりです、プレイライフの熊崎です!
最近体調を崩すことが多く、アウトプットができておりませんでした。
体調を崩していた私が言うのもどうかとは思いますが、季節の変わり目ですので体調管理には気をつけましょう!

というわけで、久々のアウトプットを行っていきたいと思います。

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メソッドはどのような挙動を示すのか?

先ほどの書籍テーブル、著者テーブルの例を使用する。

sample.rb
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

最後に

フレームワークはとても便利ですが、反面何をやっているか見えにくいところもあるので、今後もフレームワークの裏側ではどのような処理が行われているのかまでしっかりと理解していきたいと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1