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