W ARel where()
metody mogą przyjmować tablice jako argumenty, które wygenerują zapytanie „WHERE id IN ...”. Więc to, co napisałeś, jest w porządku.
Na przykład następujący kod ARel:
User.where(:id => Order.where(:user_id => 5)).to_sql
... co jest równoważne z:
User.where(:id => [5, 1, 2, 3]).to_sql
... wyświetli następujący kod SQL w bazie danych PostgreSQL:
SELECT "users".* FROM "users" WHERE "users"."id" IN (5, 1, 2, 3)"
Aktualizacja: w odpowiedzi na komentarze
Okej, więc źle zrozumiałem pytanie. Uważam, że chcesz, aby zapytanie podrzędne wyraźnie wymieniało nazwy kolumn, które mają być wybrane, aby nie trafić do bazy danych dwoma zapytaniami (co w najprostszym przypadku robi ActiveRecord).
Możesz użyć project
dla select
w swoim sub-selekcji:
accounts = Account.arel_table
User.where(:id => accounts.project(:user_id).where(accounts[:user_id].not_eq(6)))
... co dałoby następujący kod SQL:
SELECT "users".* FROM "users" WHERE "users"."id" IN (SELECT user_id FROM "accounts" WHERE "accounts"."user_id" != 6)
Mam szczerą nadzieję, że tym razem dałem Ci to, czego chciałeś!