In ARel können die where()
Methoden Arrays als Argumente verwenden, die eine Abfrage "WHERE id IN ..." generieren. Was Sie geschrieben haben, ist also in die richtige Richtung.
Zum Beispiel der folgende ARel-Code:
User.where(:id => Order.where(:user_id => 5)).to_sql
... was entspricht:
User.where(:id => [5, 1, 2, 3]).to_sql
... würde das folgende SQL in einer PostgreSQL-Datenbank ausgeben:
SELECT "users".* FROM "users" WHERE "users"."id" IN (5, 1, 2, 3)"
Update: als Antwort auf Kommentare
Okay, also habe ich die Frage falsch verstanden. Ich glaube, Sie möchten, dass die Unterabfrage die Spaltennamen, die ausgewählt werden sollen, explizit auflistet, um die Datenbank nicht mit zwei Abfragen zu treffen (was ActiveRecord im einfachsten Fall tut).
Sie können project
für die select
in Ihrer Unterauswahl verwenden:
accounts = Account.arel_table
User.where(:id => accounts.project(:user_id).where(accounts[:user_id].not_eq(6)))
... was das folgende SQL erzeugen würde:
SELECT "users".* FROM "users" WHERE "users"."id" IN (SELECT user_id FROM "accounts" WHERE "accounts"."user_id" != 6)
Ich hoffe aufrichtig, dass ich Ihnen diesmal gegeben habe, was Sie wollten!