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)"
업데이트 : 의견에 대한 응답
좋아, 그래서 나는 그 질문을 오해했다. 두 개의 쿼리 (가장 간단한 경우 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)
이번에는 당신이 원했던 것을 진심으로 바랍니다!