रेलों में स्कोप / name_scope क्या है?


105

मैंने हाल ही में एक इंटर्नशिप शुरू की है। मेरा नियोक्ता रेल पर रूबी का उपयोग करता है, और मुझे अक्सर नए सिंटैक्स का सामना करना पड़ता है जिसे समझने के लिए मुझे देखने की आवश्यकता है। मैंने name_scope की एक अच्छी व्याख्या के लिए चारों ओर घूम लिया है, लेकिन मैंने अब तक जो भी पाया है, वह ज्यादातर ब्लॉग पोस्ट है, इसके लिए उच्च प्रशंसा दे रहा है, बल्कि एक सीधी परिभाषा या परिचय।

रेलों पर माणिक में वास्तव में name_scope (जिसे अब बस स्कोप कहा जाता है) का नाम क्या है?



2
स्कोप नाम सीखते समय यह ब्लॉग पोस्ट मेरे लिए अमूल्य थी: ryandaigle.com/articles/2008/8/20/…
पीटर ब्राउन

@notapatch का लिंक मृत है क्या आपके पास एक और है?
mbigras

रयान Daigle: नाम स्कोप: यह बस स्थितियां, फिर पता है ?: के लिए नहीं है web.archive.org/web/20160306110506/http://...
notapatch

जवाबों:


212

एक गुंजाइश संग्रह का एक सबसेट है। जटिल लगता है? यह नहीं है। इसकी कल्पना करें:

आपके पास उपयोगकर्ता हैं। अब, उनमें से कुछ उपयोगकर्ता आपके न्यूज़लेटर की सदस्यता ले चुके हैं। आपने उन लोगों को चिह्नित किया है जो उपयोगकर्ता डेटाबेस (user.subscribed_to_newsletter = true) पर एक फ़ील्ड जोड़कर समाचार पत्र प्राप्त करते हैं। स्वाभाविक रूप से, आप कभी-कभी उन उपयोगकर्ताओं को प्राप्त करना चाहते हैं जो आपके न्यूज़लेटर के सदस्य हैं।

आप निश्चित रूप से, हमेशा ऐसा कर सकते हैं:

User.where(subscribed_to_newsletter: true).each do #something

हमेशा यह लिखने के बजाय, आप इस तरह से कुछ कर सकते हैं।

#File: users.rb
class User < ActiveRecord::Base
  scope :newsletter, where(subscribed_to_newsletter: true)
  #yada yada
end

यदि आप रेल 4 या नए का उपयोग कर रहे हैं , तो इसके बजाय यह करें:

#File: users.rb
class User < ActiveRecord::Base
  scope :newsletter, -> { where(subscribed_to_newsletter: true) }
  #yada yada
end

यह आपको केवल ऐसा करके अपने ग्राहकों तक पहुंचने की अनुमति देता है:

User.newsletter.each do #something

यह एक बहुत ही सरल उदाहरण है लेकिन सामान्य स्कोप में आपके काम को आसान बनाने के लिए बहुत शक्तिशाली उपकरण हो सकते हैं।

इस लिंक को देखें: एपीआई विवरण


7
क्या मैं यह पूछ सकता हूं कि 'सबस्क्राइबर्स' नामक उपयोगकर्ता वर्ग में एक विधि को परिभाषित करने से इस पर क्या फायदे होंगे? उदाहरण के लिए 'स्वयं को परिभाषित करें। सदस्यता समाप्त करें। कहीं भी: (सब्स्क्राइब्ड_तो_न्यूजलेटर => सत्य) अंत
रेडरॉट

3
@redroot का फायदा यह है कि scopeसिंटैक्स ज्यादा साफ-सुथरा होता है, आपको एक ही नतीजा मिलता है लेकिन सिर्फ एक लाइन के साथ
Aldo 'xoen' Giambelluca

9
@redroot एक बड़ा दक्षता लाभ हुआ करता था, क्योंकि स्कोप डेटाबेस को आलसी तरीके से क्वेरी करते थे जबकि विधियाँ इसे उत्सुकता से करती थीं। रेल 3 में, विधियों को भी आलसी मिला, इसलिए अब अंतर अधिक वाक्यात्मक है। स्रोत
evanrmurphy

एपीआई दस्तावेज़ लिंक कृपया अद्यतन टूट गया है api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/...
Lohith एमवी

इसके अलावा
स्कोपेड

34

सक्रिय रिकॉर्ड में स्कोप वर्ग विधियों की तरह है, लेकिन वे संबंध वस्तु लौटाते हैं, जिसका अर्थ है कि आप इस पर एक और गुंजाइश या सक्रिय रिकॉर्ड क्वेरी विधि कह सकते हैं।

उदाहरण के लिए, यदि आपके पास नीचे वर्णित गुंजाइश विधियों के साथ एक ज़ोंबी मॉडल (लाश तालिका) है,

class Zombie
  scope :rotting, -> { where(rotting: true) }
  scope :fresh, -> { where('age < ?', 25) }
  scope :recent, -> { order(created_at: :desc) }
end

और तुम बुलाओ

Zombie.rotting.fresh.recent.limit(3)

यह SQL में नीचे का अनुवाद करता है,

select "zombies.*" from "zombies" where "zombies"."rotting" = 't' and (age<20) order by create_at desc limit 3

ऊपर दिया गया उदाहरण रेल 4 सिंटैक्स पर आधारित है


मैं किसी भी दस्तावेज में आदेश का एक उदाहरण नहीं ढूंढ सकता (: create_at,: desc)। क्या यह संभव है कि आपका मतलब है scope :recent, -> { order(created_at: :desc) }? apidock.com/rails/v4.2.9/ActiveRecord/QueryMethods/order
नोट करें

7

विवरण के बारे में समझने का सबसे अच्छा तरीका एपीआई दस्तावेज़ीकरण है।

आपको पूर्ण विवरण और तरीके जिनसे हम स्कोप का उपयोग कर सकते हैं।

स्कोप का एपीआई प्रलेखन


7

स्कोप और कुछ नहीं बल्कि क्लास के तरीके हैं।

उनका उपयोग क्यों करें?

स्कोपिंग आपको आमतौर पर उपयोग किए जाने वाले प्रश्नों को निर्दिष्ट करने की अनुमति देता है (इसे लंबे या सबसे अधिक बार उपयोग किए जाने वाले प्रश्नों के लिए एक शॉर्टकट माना जा सकता है) जिसे एसोसिएशन ऑब्जेक्ट्स या मॉडल पर विधि कॉल के रूप में संदर्भित किया जा सकता है। इन स्कोप्स के साथ, आप पहले से कवर की गई हर विधि का उपयोग कर सकते हैं जैसे कि, जहां मिलती है और शामिल होती है। सभी गुंजाइश विधियाँ एक ActiveRecord :: Relation object लौटाएंगी जो आगे के तरीकों (जैसे कि अन्य स्कोप) को उस पर कॉल करने की अनुमति देगा।

एक साधारण दायरे को परिभाषित करने के लिए, हम कक्षा के अंदर स्कोप विधि का उपयोग करते हैं, उस क्वेरी को पास करना जिसे हम इस स्कोप को चलाना चाहते हैं:

class Article < ActiveRecord::Base
  scope :published, -> { where(published: true) }
end

यह बिल्कुल एक वर्ग विधि को परिभाषित करने के समान है, और जो आप उपयोग करते हैं वह व्यक्तिगत प्राथमिकता का मामला है:

class Article < ActiveRecord::Base
  def self.published
    where(published: true)
  end
end

उदाहरण के साथ पूर्ण विवरण के लिए कृपया निम्नलिखित लिंक का अनुसरण करें। उम्मीद है इससे आपको मदद मिलेगी।

http://guides.rubyonrails.org/active_record_querying.html


3
यह एक वर्ग विधि को परिभाषित करने के समान नहीं है । क्लास के तरीके nilकुछ मामलों में वापस आते हैं , और इस प्रकार कुछ शर्तों के लिए चेनेबल नहीं होते हैं।
अर्सलान अली

1
  • कल्पना कीजिए कि आपके पास एक मॉडल है: व्यक्ति

अब आप कल्पना कीजिए:

  • दुनिया के सभी लोग चाहते हैं जिनके बाल लाल हैं।
  • दुनिया के सभी लोग चाहते हैं जो क्रिकेट खेलते हैं

आप एक दायरे का उपयोग करके लोगों के उन विशेष वर्गों को प्राप्त कर सकते हैं!

Person.red_hair.cricket ## finds all people with red hair who play cricket
Person.red_hair ## finds all people with red hair
Person.cricket ## finds all people who play cricket.

अब यह इतना कठिन नहीं था?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.