В 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
... выдает следующий SQL в базе данных PostgreSQL:
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)
Я искренне надеюсь, что далВы, что вы хотели на этот раз!