В 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)
Щиро сподіваюся, що цього разу я дав тобі те, що ти хотів!