Hyurakuのエンジニア日誌

SE出身Webエンジニアのブログ

テーブルを呼び出す、または結合するRailsのメソッド #19

テーブルを呼び出す、または結合するメソッドがいくつかあるので、
今回はドキュメントに記載されている例を元に振り返る。

1. includes

関連しているテーブルを呼び出す。

Page.includes(:category)
# SELECT "pages".* FROM "pages"
# SELECT "categories".* FROM "categories" WHERE "categories"."id" IN (1)

関連しているテーブルの数だけ呼び出す。
テーブル結合はしていない。

2. joins

複数のテーブルを結合して検索している。

Category.joins(:posts)
# SELECT categories.* FROM categories INNER JOIN posts ON posts.category_id = categories.id

実際には内部結合している。

3. eager_load

指定したテーブルのすべてのデータを取得する。

User.eager_load(:posts)
=> SELECT "users"."id" AS t0_r0, "users"."name" AS t0_r1, ...
FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" =
"users"."id"

実際には外部結合している。

なお、外部結合と内部結合の違いは次のとおり。 - 内部結合 一致するもののみ抽出対象

  • 外部結合 一致するものがないレコードも抽出対象

4. preload

APIdockには次のように書かれていた。

# includesと同じ方法で、指定したテーブルを呼び出す。

User.preload(:posts)
=> SELECT "posts".* FROM "posts" WHERE "posts"."user_id" IN (1, 2, 3)