Rails में Scope क्या है और यह क्यों उपयोगी है?
Scope, Rails मॉडल के अंदर scope मेथड का उपयोग करके परिभाषित की जाने वाली कस्टम क्वेरीज हैं।
हर scope दो आर्गुमेंट्स लेता है:
- एक नाम, जिसका उपयोग आप अपने कोड में इस scope को कॉल करने के लिए करते हैं।
- एक लैम्ब्डा, जो क्वेरी को लागू करता है।
यह कुछ इस तरह दिखता है:
class Fruit < ApplicationRecord
scope :with_juice, -> { where("juice > 0") }
end
Scope को कॉल करने के परिणामस्वरूप, आपको एक ActiveRecord::Relation ऑब्जेक्ट मिलेगा।
इसका मतलब है कि आप scopes को चेन और कंबाइन कर सकते हैं!
उदाहरण:
Fruit.with_juice.with_round_shape.first(3)
Scopes का उपयोग कब करें?
ठीक है, scopes कूल हैं, लेकिन आपको उनका उपयोग कब करना चाहिए?
आइए एक उदाहरण देखते हैं।
def index
@books = Book.where("LENGTH(title) > 20")
end
यह एक index कंट्रोलर एक्शन है जो 20 कैरेक्टर्स से लंबे शीर्षक वाली किताबें प्रदर्शित करना चाहता है।
यह ठीक है।
लेकिन अगर आप इस क्वेरी को अन्य जगहों पर उपयोग करना चाहते हैं, तो आपके पास डुप्लिकेट कोड होगा।
डुप्लिकेट कोड आपके प्रोजेक्ट को मेंटेन करना कठिन बनाता है।
आइए इस क्वेरी को एक scope में मूव करते हैं।
इस तरह:
class Book
scope :with_long_title, -> { where("LENGTH(title) > 20") }
end
अब हमारा कंट्रोलर एक्शन इस तरह दिखता है:
def index @books = Book.with_long_title end
बहुत बढ़िया!
आर्गुमेंट्स के साथ Rails Scopes का उपयोग कैसे करें
आप एक scope में वेरिएबल पेश करना चाह सकते हैं ताकि इसे और अधिक फ्लेक्सिबल बनाया जा सके।
यहाँ कैसे:
class Book
scope :with_long_title, ->(length) { where("LENGTH(title) > ?", length) }
end
क्वेश्चन मार्क (?) एक प्लेसहोल्डर है, जिसे length के मान से रिप्लेस किया जाएगा। यह आपके कोड को सुरक्षित बनाता है।
अगर आप एक डिफ़ॉल्ट वैल्यू चाहते हैं:
class Book
scope :with_long_title, ->(length = 20) { where("LENGTH(title) > ?", length) }
end
इसे आज़माएं!
Scope बनाम Class Method
Scopes कुछ जादुई या सुपर स्पेशल नहीं कर रहे हैं।
वे सिर्फ मेथड्स हैं।
वास्तव में... आप क्लास मेथड्स का उपयोग करके भी वही काम कर सकते हैं!
इस तरह:
class Fruit
def self.with_juice
where("juice > 0")
end
end
लेकिन क्लास मेथड्स पर scopes का उपयोग करने के डिज़ाइन फायदे हैं।
यहाँ क्यों:
- Scopes अपने सिंटैक्स के कारण क्लीनर कोड का परिणाम देते हैं
- Scopes ठीक एक चीज़ के लिए उपयोग किए जाते हैं, इसलिए आप जानते हैं कि आपको क्या मिलेगा जैसे ही आप एक को देखते हैं
- Scopes अन्य मेथड्स के साथ मिक्स नहीं होते, इसलिए उन्हें ढूंढना आसान होता है
फंक्शनैलिटी के संदर्भ में, एकमात्र अंतर यह है कि scopes एक ActiveRecord::Relation की गारंटी देते हैं, और क्लास मेथड्स नहीं।
यह आपको तब एरर से बचने में मदद करता है जब आपका scope कुछ भी वापस नहीं करता।
Default Scopes का उपयोग न करें
एक डिफ़ॉल्ट scope वह है जो आपके मॉडल पर ऑटोमैटिकली लागू होता है।
उदाहरण:
class Post
default_scope { where(published: true) }
end
हाँ! डिफ़ॉल्ट scopes बहुत आकर्षक हैं।
लेकिन वे अक्सर गलत विकल्प होते हैं क्योंकि आप शायद भूल जाएंगे कि वे परिभाषित हैं, अजीब एरर में पड़ेंगे, और कीमती समय डीबगिंग में बर्बाद करेंगे।
इसके साथ ही...
अगर आपको डिफ़ॉल्ट scopes के साथ काम करना है, तो आपको वर्तमान में लागू सभी scopes को डिसेबल करने के लिए unscoped मेथड का उपयोग करने की आवश्यकता हो सकती है।
वीडियो ट्यूटोरियल देखें
सारांश
बहुत बढ़िया! इस आर्टिकल को पढ़ने के परिणामस्वरूप, आपने Rails scopes का उपयोग करने का सबसे प्रभावी तरीका सीख लिया है।
इस नए ज्ञान को अभ्यास में लाना न भूलें ताकि आप याद रख सकें कि यह कैसे काम करता है।
पढ़ने के लिए धन्यवाद। 🙂