2009-01-01 9 views
5

मैं रेल के लिए बिल्कुल नया हूं और मैं उत्सुक था क्योंकि कुछ सम्मेलन विशेषज्ञों का उपयोग तब होता है जब उन्हें एक जटिल जटिल क्वेरी बनाने की आवश्यकता होती है जिसमें कई स्थितियां होती हैं। विशेष रूप से, कोड को पठनीय और रखरखाव रखने के लिए।रेल में जटिल SQL क्वेरी निर्दिष्ट करने के लिए आपका सम्मेलन क्या है?

वहाँ रहे हैं तरीके मैं के बारे में सोच सकते हैं की एक जोड़ी: लगता है

सिंगल लाइन, कॉल में करने के लिए():

@pitchers = Pitcher.find(:all, "<conditions>") 

एक पूर्वनिर्धारित स्ट्रिंग का उपयोग करें और में इसे पारित:

@pitchers = Pitcher.find(:all, @conditions) 

एक प्रश्न

@pitchers = Pitcher.find(:all, conditionfunction) 
वापस जाने के लिए एक निजी सदस्य फ़ंक्शन का उपयोग करें

मैं निजी सदस्य समारोह सम्मेलन की तरफ झुकता हूं, इसके अतिरिक्त, क्योंकि आप क्वेरी को कस्टमाइज़ करने के लिए पैरामीटर में पास कर सकते हैं।

इस पर कोई विचार?

उत्तर

7

मैं लगभग find पर शर्तों को कभी पास नहीं करता हूं। आम तौर पर उन स्थितियों को आपके ऑब्जेक्ट मॉडल में named_scope के रूप में या मॉडल पर केवल एक क्लास विधि के रूप में जोड़ने के लिए मूल्यवान होगा। नामित स्कोप अच्छे हैं क्योंकि आप उन्हें चेन कर सकते हैं, जो जटिलता से काटने का थोड़ा सा हिस्सा लेता है। वे आपको पैरामीटर भी पास करने की अनुमति देते हैं।

इसके अलावा, आपको लगभग कभी भी कच्ची SQL स्थिति स्ट्रिंग पास नहीं करनी चाहिए। आपको या तो हैश शैली (:conditions => { :name => 'Pat' }) या सरणी शैली (['name = ?', 'Pat']) का उपयोग करना चाहिए। इस तरह, एसक्यूएल आपके लिए बच निकला है, एसक्यूएल इंजेक्शन हमलों के खिलाफ कुछ सुरक्षा प्रदान करता है।

अंत में, मुझे लगता है कि जिस दृष्टिकोण पर आप विचार कर रहे हैं, जहां आप find पर कॉल करने वाले किसी भी संदर्भ में स्थितियां बनाने की कोशिश कर रहे हैं, यह एक दोषपूर्ण दृष्टिकोण है। यह एक इंटरफेस प्रदान करने के लिए मॉडल का काम है जिसके माध्यम से प्रासंगिक प्रतिक्रिया वापस आती है। यदि आप मुझसे पूछें तो find कॉल में जाने के लिए शर्तों को निर्धारित करने का प्रयास अंतर्निहित कार्यान्वयन के बहुत करीब है। इसके अलावा परीक्षण करना मुश्किल है।

+0

उत्कृष्ट टिप्पणियां, धन्यवाद! – unknownuser

+0

मदद करने के लिए खुशी हुई। मुझे आपसे यह पूछने दो: आप किस संदर्भ में 'ढूंढ' कह रहे हैं? नियंत्रक? अन्य मॉडल? मुझे उम्मीद नहीं है :) – nakajima

+0

नियंत्रक से। मैं इस तरह से अपने अधिकांश खोजों को कर रहा हूं। मैं उन्हें मॉडल में धक्का देने पर विचार करूंगा। – unknownuser

संबंधित मुद्दे