背景
- Railsで検索フォームを作っています
- お手本のコードに読み慣れないメソッドがいっぱい&SQL自体慣れていないので、勉強しながらノートにまとめてみました
▼環境
- Rails 5.2.3
- Ruby 2.6.0
なお、このメソッドについては下記の記事が大変丁寧に紹介してくれています。本記事はこちらの記事の自分なりの焼き直しです。
【Rails】joinsメソッドのテーブル結合からネストまでの解説書
joins
メソッドについて
SQLのINNER JOIN
を実現するメソッドです。
INNER JOIN
とは、ある2つのテーブルについてAかつBの部分を取り出すSQL文です。
基本の構文はこちらです。
> User.joins(:posts)
SELECT `users`.*
FROM `users`
INNER JOIN `posts` /* 結合先のテーブル */
ON `posts`.`user_id` = `users`.`id` /* 結合の条件 */
この時、
- postsがないuser
- userがないposr
のデータは取り出されません。
発行されるSQLが複雑なのでびっくりしますが、結構シンプルなメソッドですね
1点、注意したほうが良いなと思ったのは、User.joins(:posts)
の:posts
の部分は、テーブル名ではなく、関連名だということでしょうか...?
例えば、以前こんなアソシエーションを組みましたが、
class User < ApplicationRecord
has_many :like_posts, through: :likes, source: :post
end
この場合は、User.joins(:like_posts)
のように書く必要があるようです。