LoginSignup
0
0

More than 3 years have passed since last update.

[Rails] 2つのテーブルをjoinsで結合したときのwhereのRailsライクな書き方

Posted at

きっかけ

2つのテーブルをjoinsで結合した際に、結合した側のテーブルのカラムを使用して
whereで絞り込みをする際に、どうしてもwhereの中でSQLライクな書き方をしていました。

それをRailsライクな書き方で書く方法を見つけたので残しておきます。

前提

以下のような関連があったとします。

Author has_many Book(s)
Book belongs_to Author

あるAuthorが複数のBookを持っている、という状況です。
これらのテーブルは、主に以下のようなカラムを持ち合わせています。

Author
 - id
 - name

Books
 - id
 - name
 - author_id

idとnameという同じ名前のカラムがあります。

本題

   Author.joins(:books)

とすれば、SQLのINNER JOINが実行されるので
author.idbook.author_idが等しい、つまり
author.id == book.author_idとなるようなレコードが抽出されます。
ということは、book.author_id == nilのレコードはこの時点で弾かれます。

ではここで、Bookのnameに対してwhereを使って絞り込みを行いたいと思います。

SQLライクな書き方

その際、自分はいつもこのようなSQLライクな書き方をしていました。

   Author.joins(:books).where("books.name": "XXXXX")

これをRailsライクな書き方で書こう、ということです。

Railsライクな書き方

以下のようにネストするだけです。

   Author.joins(:books).where(books: { name: "XXXXX" } )

これで上記SQLライクの場合と同じように調べられます。
ぱっと見、わかりやすくなったなと個人的には思っています。



おわり

0
0
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
0
0