子要素を持つ親要素だけ取得したい場合、SQLによる抽出が必要となる。
Railsでは何気なくuser.productsなど取得しているが、これはRailsがSQLの記述を省略しているにすぎない。複雑になれば、SQLは必要となる。
本題
子要素を持つ親要素のみ取得したい場合どうすればいいでしょうか??
何気にわからないと思います。
親要素:User
子要素:Product
productを持つUserだけ取得したい場合、下記になります。
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の違い
[参考ページ]
(https://q.hatena.ne.jp/1418825151)
一番参考になるページ