きっかけ
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.id
とbook.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ライクの場合と同じように調べられます。
ぱっと見、わかりやすくなったなと個人的には思っています。
おわり