उदाहरण के लिए मान लें कि आपके पास है:

       class Model < AR::Base 
         has_many :somethings, :finder_sql => "SELECT * FROM somethings"
       end

       class Something < AR::Base
         named_scope :valuable {...code...}
       end

       # Assume you have one model but 0 somethings:  
       # Model.first.somethings          # => [] Good!
       # Model.first.somethings.valuable # => nil Bad! Should return [] !!!

यह केवल तब होता है जब आपके पास has_many संबंध में finder_sql होता है। अन्य मामलों में यह अपेक्षा के अनुरूप काम करता है।

रेल 2.3.14 का यह सामान्य व्यवहार है?

3
Filip 7 अक्टूबर 2011, 17:57
आपके पास finder_sql निर्दिष्ट क्यों है? आप बस मौजूदा ar has_many क्वेरी लुकअप कोड की नकल कर रहे हैं
 – 
cpjolicoeur
7 अक्टूबर 2011, 18:54
नहीं, मैं नहीं। आप देखिए मेरे पास WHERE की स्थिति बिल्कुल नहीं है।
 – 
Filip
7 अक्टूबर 2011, 19:00
तो मुझे लगता है कि मैं पूरी तरह से खो गया हूं कि आपके मॉडल सेटअप क्यों हैं आप कैसे करते हैं। यदि आप कुछ वस्तुओं का पूरा संग्रह चाहते हैं, तो आपको इसे मॉडल पर has_many के रूप में घोषित नहीं करना चाहिए - क्योंकि इसका मतलब है कि यह 1-से-अनेक संबंध जहाज है। क्यों न केवल अपनी खुद की क्लास विधि का उपयोग करें जो एआर :: रिलेशन ऑब्जेक्ट को कुछ ऑब्जेक्ट्स के साथ लौटाता है जिसे आप ढूंढ रहे हैं?
 – 
cpjolicoeur
10 अक्टूबर 2011, 23:10
@ फिलिप: आपको या तो जवाब स्वीकार करना चाहिए या समझाएं कि यह अच्छा क्यों नहीं है। अन्य उपयोगकर्ताओं के प्रयासों की सराहना करें।
 – 
tokland
16 पद 2011, 16:55

1 उत्तर

सबसे बढ़िया उत्तर

हां, यदि आप finder_sql निर्दिष्ट करते हैं, तो आप स्कोप को जोड़ने में सक्षम नहीं होंगे। ऐसा इसलिए है क्योंकि finder_sql उन स्थितियों के लिए है जो सामान्य सक्रिय रिकॉर्ड प्रतिमान में फिट नहीं होती हैं। कहा जा रहा है, जिस तरह से आपने इसे बनाया है वह गलत है। आपको इस तरह के रिश्ते में बिना किसी फ़िल्टर के चयन * को स्टोर करने की आवश्यकता नहीं है। रिश्ते का उद्देश्य दूसरे मॉडल पर फ़िल्टर लागू करना है। तो, जिस तरह से आपके पास यह है Model.find(params[:id]).somethings बिल्कुल कुछ कॉल करने जैसा ही है। बाद के मामले में दायरा आपके लिए काम करेगा क्योंकि .all को स्कोप किया जा सकता है।

2
Chris Drappier 7 अक्टूबर 2011, 23:47