1
1

More than 3 years have passed since last update.

【Ruby on Rails && SQL】アソシエーションで子要素を持つ親要素だけ取得したい場合

Last updated at Posted at 2020-03-08

子要素を持つ親要素だけ取得したい場合、SQLによる抽出が必要となる。
Railsでは何気なくuser.productsなど取得しているが、これはRailsがSQLの記述を省略しているにすぎない。複雑になれば、SQLは必要となる。

本題

子要素を持つ親要素のみ取得したい場合どうすればいいでしょうか??
何気にわからないと思います。

親要素:User
子要素:Product

productを持つUserだけ取得したい場合、下記になります。

子要素を持つ親要素だけ取得1
User.joins(:products).preload(:products)

この処理だとSQLとしては下の処理がされます。

User Load (3.2ms)  SELECT `users`.* FROM `users` INNER JOIN `products` ON `products`.`user_id` = `users`.`id`

products.user_id = users.idで成立するレコードだけを残します。
つまり、productを持たないuserは除外されます。

class_nameでカラムを定義している場合

class_nameでカラム名をuser_id定義しておらず、buyer_idと定義している場合は下記になります。

子要素を持つ親要素だけ取得する
User.joins('LEFT JOIN Products ON users.id = products.buyer_id').where('products.id IS NOT NULL').uniq

【INNER JOIN, LEFT JOIN , RIGHT JOIN】テーブル結合の挙動をまとめてみた【SQL】
Rails における内部結合、外部結合まとめ
ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い
参考ページ
一番参考になるページ

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