ARel では、where()
メソッドは「WHERE id IN...」クエリを生成する引数として配列を取ることができます。したがって、あなたが書いたことは正しい線に沿っています。
たとえば、次の 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)
今回はあなたが望んでいたものを提供できたことを心から願っています!