ARelでは、where()
メソッドは「WHERE idIN ...」クエリを生成する引数として配列を受け取ることができます。だからあなたが書いたものは正しい線に沿っています。
たとえば、次のARelコード:
User.where(:id => Order.where(:user_id => 5)).to_sql
...これは次と同等です:
User.where(:id => [5, 1, 2, 3]).to_sql
... PostgreSQLデータベースに次のSQLを出力します。
SELECT "users".* FROM "users" WHERE "users"."id" IN (5, 1, 2, 3)"
更新:コメントに応じて
さて、私はその質問を誤解しました。2つのクエリでデータベースにアクセスしないようにするために、サブクエリに選択する列名を明示的にリストする必要があると思います(これは最も単純なケースでActiveRecordが行うことです)。
あなたは使用することができるproject
ためselect
、あなたのサブを選択します:
accounts = Account.arel_table
User.where(:id => accounts.project(:user_id).where(accounts[:user_id].not_eq(6)))
...これは次のSQLを生成します:
SELECT "users".* FROM "users" WHERE "users"."id" IN (SELECT user_id FROM "accounts" WHERE "accounts"."user_id" != 6)
今回はあなたが欲しいものをお渡ししたことを心から願っています!