サブクエリを使ってクエリ発行回数を抑える(Active Record)

https://tech.smarthr.jp/entry/2021/11/11/151444 を改めて読み返した

Comment.where(post_id: Post.where(opened: true).pluck(:id))

これだとPostオブジェクトは作成作成されないけど、PostのpluckとCommentの取得で2回クエリが発行される。(SELECT id FROM posts WHERE opened = true と SELECT * FROM comments WHERE post_id IN (1個目のクエリで取得したid)の2回。1回目のクエリでidの配列が取れた配列を使って別のクエリを作っている。)

Comment.where(post_id: Post.where(opened: true).select(:id))
#=> SELECT "comments".* FROM "comments" WHERE "comments"."post_id" IN (SELECT "posts"."id" FROM "posts" WHERE "posts"."opened" = "true")

selectを使うとサブクエリ扱いになり、1回のクエリでCommentを取得できる。