एक के साथ संयुक्त has_many तालिका में एक आंतरिक जुड़ाव प्रदर्शन करना group
या uniq
संभावित रूप से बहुत अक्षम है, और SQL में यह बेहतर रूप से अर्ध- EXISTS
जुड़ाव के रूप में कार्यान्वित किया जाएगा जो एक सहसंबद्ध उपश्रेणी के साथ उपयोग करता है ।
यह क्वेरी ऑप्टिमाइज़र को सही प्रोजेक्ट_आईडी वाली पंक्ति के अस्तित्व की जांच करने के लिए रिक्तियों तालिका की जांच करने की अनुमति देता है। इससे कोई फर्क नहीं पड़ता कि एक पंक्ति या एक लाख है जो कि project_id है।
यह रेल में उतना सीधा नहीं है, लेकिन इसके साथ प्राप्त किया जा सकता है:
Project.where(Vacancies.where("vacancies.project_id = projects.id").exists)
इसी प्रकार, उन सभी परियोजनाओं को खोजें जिनमें कोई रिक्तियाँ नहीं हैं:
Project.where.not(Vacancies.where("vacancies.project_id = projects.id").exists)
संपादित करें: हाल के रेल संस्करणों में आपको एक पदावनति चेतावनी मिलती है, जो आपको यह बताती है कि आप को इस पर भरोसा नहीं किया exists
जा सकता है। इसे ठीक करें:
Project.where.not(Vacancies.where("vacancies.project_id = projects.id").arel.exists)
संपादित करें: यदि आप कच्चे SQL के साथ असहज हैं, तो प्रयास करें:
Project.where.not(Vacancies.where(Vacancy.arel_table[:project_id].eq(Project.arel_table[:id])).arel.exists)
arel_table
उदाहरण के लिए, के उपयोग को छिपाने के लिए वर्ग विधियों को जोड़कर आप इसे कम गन्दा बना सकते हैं :
class Project
def self.id_column
arel_table[:id]
end
end
... इसलिए ...
Project.where.not(
Vacancies.where(
Vacancy.project_id_column.eq(Project.id_column)
).arel.exists
)