ARel'de where()
yöntemler, dizileri "WHERE id IN ..." sorgusu oluşturacak argüman olarak alabilir. Yani yazdıklarınız doğru satırlardadır.
Örneğin, aşağıdaki ARel kodu:
User.where(:id => Order.where(:user_id => 5)).to_sql
... eşdeğer olan:
User.where(:id => [5, 1, 2, 3]).to_sql
... bir PostgreSQL veritabanında aşağıdaki SQL'i çıktılar:
SELECT "users".* FROM "users" WHERE "users"."id" IN (5, 1, 2, 3)"
Güncelleme: yorumlara yanıt olarak
Tamam, yani soruyu yanlış anladım. Veritabanını iki sorgu ile vurmamak için alt sorgunun seçilecek sütun adlarını açıkça listelemesini istediğinizi düşünüyorum (en basit durumda ActiveRecord bunu yapar).
Alt seçiminizdeki project
için kullanabilirsiniz select
:
accounts = Account.arel_table
User.where(:id => accounts.project(:user_id).where(accounts[:user_id].not_eq(6)))
... aşağıdaki SQL'i üretir:
SELECT "users".* FROM "users" WHERE "users"."id" IN (SELECT user_id FROM "accounts" WHERE "accounts"."user_id" != 6)
İçtenlikle umarım bu sefer size istediğinizi vermişimdir!