2012-03-15 18 views
10

का वास्तविक लाभ क्या है मैंने किसी भी ActiveRecord क्लास विधि पर किसी दायरे के लाभ को खोजने का प्रयास करने वाले 10 से अधिक पृष्ठों को देखा है जो ActiveRecord :: Relation देता है।स्कॉप्स

उदाहरण के लिए निम्नलिखित में क्यों है जो एक ही काम करते हैं यह नीचे विकल्प की तुलना में बेहतर स्कोप हैं:

#scope :pat1, lambda {{:conditions => ["name like ?", 'J%']}}  
    #scope :pat2, lambda {{:conditions => ["id > 5"]}} 

    def self.pat1 
    where("name like ?", 'J%') 
    end 

    def self.pat2 
    where("id > 5") 
    end 

    def patx 
    self.class.pat1.pat2.first 
    end 

प्रलेखन बार बार कहता है कि स्कोप फायदेमंद होते हैं, क्योंकि वे श्रृंखलित जा सकता है ...

"सभी स्कोप विधियां एक ActiveRecord :: रिलेशन ऑब्जेक्ट लौटाएंगी जो आगे के तरीकों (जैसे अन्य स्कोप) को इसके लिए बुलाएगी।" - guides.rubyonrails.org

http://ruby.railstutorial.org

... लेकिन विकल्प के ऊपर भी उत्पादन श्रृंखलित जा सकता है "मुख्य कारण स्कोप सादा वर्ग तरीकों से बेहतर हैं कि वे अन्य तरीकों के साथ श्रृंखलित किया जा सकता है" एक ही परिणाम।

बस यह पता लगाने की कोशिश कर रहा है कि यहां सम्राट की नई कपड़े चीजें चल रही हैं या नहीं। एक वाक्य रचनात्मक दृष्टिकोण से भी कोई फायदा नहीं होता है। क्या वे तेजी से हैं- कुछ स्रोत अस्पष्ट रूप से सुझाव देते हैं।

उत्तर

3

ActiveRecord scopes वास्तव में पहले से ही उल्लेख किए गए सर्वोत्तम अभ्यास में लिपटे सिंटैक्स चीनी हैं।

रेल के 2.x दिनों में, जब उन्हें "name_scope" कहा जाता था, तो वे थोड़ी अधिक mattered। उन्होंने एक क्वेरी उत्पन्न करने के लिए शर्तों की आसान श्रृंखला की अनुमति दी। एरियल के साथ रेल 3.x में सुधार के साथ, जैसा कि आपने नोट किया है, क्वेरी संबंधों के लिए कार्यों को बनाना आसान है। Scopes सिर्फ श्रृंखला, पूर्वनिर्धारित प्रश्नों के लिए एक सरल और सुरुचिपूर्ण समाधान प्रदान करते हैं। मॉडल के शीर्ष पर सभी स्कोप होने से पठनीयता में सुधार होता है और यह दिखाता है कि मॉडल का उपयोग कैसे किया जाता है।

+0

अरेल मुझे लगता है कि ActiveRecord :: संबंध है। ठीक। वाक्य रचनात्मक लाभ मेरे लिए बहस योग्य लगते हैं। लेकिन अगर वे ऐसा कुछ कर रहे थे जो मानक संस्करण पिछले संस्करणों में नहीं कर सका तो यह बताता है। – Mark

+2

बेहतर वाक्यविन्यास का उपयोग कर रेल के साथ महत्वपूर्ण है। दिन 1 (या यहां तक ​​कि 100) पर कोड बेस के लिए नहीं बल्कि दिन 1000 पर कोड बेस के लिए। –

2

हां, वे वाक्य रचनात्मक शॉर्ट-कट हैं जो मूल रूप से आपके द्वारा प्राप्त विधियों का प्रतिनिधित्व करते हैं।
बेहतर क्यों?
सबसे तात्कालिक प्रभाव यह है कि 2 लाइन कोड कोड की 9 लाइनों की तुलना में पढ़ने और बनाए रखने के लिए आसान तरीका है।

रेल हमेशा एक डीआरवाई दृष्टिकोण चाहते हैं और यहां दोहराए गए def self.method end वास्तविक कोड को अस्पष्ट कर रहे हैं।

+0

आपके और सीन हिल के लिए धन्यवाद यह पुष्टि करने के लिए कि यह गति की बात नहीं है। उपरोक्त Railstutorial.org लिंक विशेष रूप से यह कहने से शुरू होता है कि स्कॉप्स का उपयोग करके उनका वैकल्पिक कार्यान्वयन किसी भी तरह से तेज़ है, लेकिन इसकी स्पष्ट रूप से स्कॉप्स का उपयोग करके उनसे संबंधित नहीं है। – Mark

3

जब आप कोई दायरा लिखते हैं, तो यह अनिवार्य रूप से वही काम कर रहा है।

def scope(name, scope_options = {}) 
     name = name.to_sym 
     valid_scope_name?(name) 
     extension = Module.new(&Proc.new) if block_given? 

     scope_proc = lambda do |*args| 
     options = scope_options.respond_to?(:call) ? unscoped { scope_options.call(*args) } : scope_options 
     options = scoped.apply_finder_options(options) if options.is_a?(Hash) 

     relation = scoped.merge(options) 

     extension ? relation.extending(extension) : relation 
     end 

     singleton_class.send(:redefine_method, name, &scope_proc) 
    end 

लाभ इस मामले में scopes है कि वे कुछ मामलों में प्रश्नों को परिभाषित करने, कोड के कम लाइनों की मुहावरेदार तरह से कर रहे हैं, और आप एक्सटेंशन कर सकते हैं: यहाँ क्या रेल स्रोत लग रहा है की तरह है।

स्रोत में उदाहरण इस प्रकार है:

scope :red, where(:color => 'red') do 
    def dom_id 
    'red_shirts' 
    end 
end 

आप Model.red.dom_id कॉल करने के लिए अनुमति देता है।

0

स्कॉप्स और क्लास विधियों के बीच कुछ बहुत ही रोचक अंतर हैं जो संबंधों को वापस करते हैं।

  1. यह एक सरल param.present? चेक के साथ क्षेत्रों के लिए नहीं के बराबर मानकों से निपटने के लिए आसान है, वर्ग के तरीकों के लिए आप स्पष्ट रूप से एक गैर शून्य संबंध लौटना चाहिए अगर एक परम एक शून्य संबंध का कारण होगा।

  2. स्कोप्स कक्षा विधियों की तुलना में अधिक आसानी से एक्स्टेंसिबल हैं। विधियों को जोड़ने के लिए बस एक ब्लॉक (उदाहरण के लिए पेजिनेशन से निपटने के लिए) पास करें। कक्षा के तरीकों को बढ़ाया जा सकता है लेकिन सुंदरता के रूप में नहीं।

पूर्ण रुंडउन के लिए this post from Plataformatec देखें।

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