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