[Rails]whereとpluckの代わりにwhereとselectの組み合わせを使おう

ActiveRecordのオブジェクトが不要な場合、whereで絞った後にpluckで欲しいカラムだけ取得すればOKと思っていた。

が、以下の記事にwhereとpluckではなくwhereとselectを使ったほうが良い例が紹介されていた。

Active Recordともっと仲良くなって自然に優しいコードを書くぞ - SmartHR Tech Blog

以下の例は上記記事から引用。

こんなかんじで書くとPostのオブジェクトは生成されない。

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

でもこれだとpluckとCommentの取得で2回クエリが発行されてしまう。

そこでselectの出番。

以下のように書けばサブクエリになるので、1回のクエリでデータ取得できる。

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")