रेल 4 के लिए:
तो, जो आप चाहते हैं वह एक आंतरिक जुड़ाव है, इसलिए आपको वास्तव में केवल विधेय का उपयोग करना चाहिए:
Foo.joins(:bar)
Select * from Foo Inner Join Bars ...
लेकिन, रिकॉर्ड के लिए, यदि आप "NOT NULL" शर्त चाहते हैं तो बस विधेय का उपयोग न करें:
Foo.includes(:bar).where.not(bars: {id: nil})
Select * from Foo Left Outer Join Bars on .. WHERE bars.id IS NOT NULL
ध्यान दें कि यह सिंटैक्स एक अवक्षेपण की रिपोर्ट करता है (यह एक स्ट्रिंग SQL स्निपेट के बारे में बात करता है, लेकिन मुझे लगता है कि हैश की स्थिति को पार्सर में स्ट्रिंग में बदल दिया गया है?), इसलिए अंत में संदर्भ जोड़ना सुनिश्चित करें:
Foo.includes(:bar).where.not(bars: {id: nil}).references(:bar)
चेतावनी चेतावनी: ऐसा लगता है कि आप उत्सुक लोडिंग टेबल (एस: (....) में से एक हैं) जो एक स्ट्रिंग SQL स्निपेट में संदर्भित हैं। उदाहरण के लिए:
Post.includes(:comments).where("comments.title = 'foo'")
वर्तमान में, सक्रिय रिकॉर्ड तालिका को स्ट्रिंग में पहचानता है, और एक अलग क्वेरी में टिप्पणियों को लोड करने के बजाय क्वेरी तालिका में शामिल करना जानता है। हालाँकि, एक पूर्ण विकसित SQL पार्सर लिखे बिना ऐसा करना स्वाभाविक रूप से त्रुटिपूर्ण है। चूँकि हम SQL पार्सर लिखना नहीं चाहते हैं, हम इस कार्यक्षमता को हटा रहे हैं। अब से, आपको स्पष्ट रूप से सक्रिय रिकॉर्ड बताना होगा जब आप किसी स्ट्रिंग से तालिका संदर्भित कर रहे हैं:
Post.includes(:comments).where("comments.title = 'foo'").references(:comments)
!nil
true
रूबी में मूल्यांकन करता है, और एआरएल एक SQL क्वेरी में अनुवादtrue
करता1
है। तो उत्पन्न क्वेरी वास्तव में है जो आपने पूछा था - यह एक एआरएल बग नहीं था।