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
... PostgreSQL डेटाबेस पर निम्न SQL आउटपुट करेगा:
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)
मुझे पूरी उम्मीद है कि मैंने आपको वही दिया है जो आप इस समय चाहते थे!