はじめに
こんにちは株式会社TOKOSのナオキです!
今回はRailsのwhere.missingを使用して関連先のないレコードを取得する方法を解説します!
この記事では以下の内容について取り上げています
- where.missingの概要
- where.missingの基本的な使用方法
- SQLクエリについて
- rails初学者の方
- railsで開発を行っている方
where.missingの概要
where.missing
はRails 6.1で追加されたActiveRecordメソッドです。
関連先がないレコードを手軽に取得できます!
例えば、投稿モデル(Post)とコメントモデル(Comment)が一体多の関係である場合、
Postに関連するCommentが存在しない投稿(コメントの存在しない投稿)を取得できます。
開発をしていると条件分岐等で、関連先がないレコードを取得したいときは結構あると思います。
そのようなときにwhere.missingを知っていると、簡潔にコードを書くことができます!
今回は説明を省きますが、where.associated
というwhere.missing
と逆の意味である、関連先が存在するレコードのみを取得できるメソッドもあります!
where.missingの基本的な使用方法
基本的な使用方法として「コメントのない投稿」を取得する方法を紹介します。
Post.where.missing(:comments)
これだけの記述でコメントのない投稿を取得できちゃいます!where.missing
がでる前は下記のようにleft_joins
とwhere
を組み合わせて取得していました。
Post.left_joins(:comments).where(comments: { id: nil })
上記の2つのコードを比べてみるとleft_joinsとwhereを使用している方は、冗長なコードになってしまっています。where.missing
を知っているだけでこのように簡潔にコードを書くことができます!
例えば「コメント(comment)もいいね(like)もない投稿」を取得する場合に、下記のコードのように複数のwhere.missing
を組み合わせて取得できます!
Post.where.missing(:comments).where.missing(likes)
上記のコードをwhere.missing
を使用しないと下記のようになります。
Post.left_joins(:comments).left_joins(:likes).where(comments: { id: nil }, likes: { id: nil })
こうやって見比べるとコードがスッキリとしているのが一目瞭然ですね!
SQLクエリについて
where.missing
が生成するSQLはLEFT OUTHER JOINを使用して、関連先のデータがNULLの行を取得します。
これにより関連先のないデータを取得できています!
例としてPost.where.missing(:comments)
が生成するSQLクエリは下記のようになります。
SELECT "posts".* FROM "posts"
LEFT OUTER JOIN "comments" ON "comments"."post_id" = "posts"."id"
WHERE "comments"."id" IS NULL
実はwhere.missing
を使用しても、left_joins
とwhere
を組み合わせたものを使用しても同じSQLが生成されます!
さいごに
今回はRailsのwhere.missingについて解説しました。
開発を方は、関連先のないレコードを取得する場面があるかと思います。
そんなときwhere.missingを知っていると、コードを簡潔に書くこともでき可読性も上げることができます。
なのでそのような場面に出会したら積極的に使っていきたいですね!