रेल में, आप अपने डेटा तक पहुँचने के लिए अपने मॉडल के माध्यम से डेटाबेस को क्वेरी कर सकते हैं।
आप ActiveRecord
. का उपयोग करके ऐसा कर सकते हैं तरीके।
जैसे where
, find
, या find_by
।
परिणामस्वरूप आपको मिलता है :
find_by
के साथ , एक रिकॉर्ड याnil
where
के साथ , एकActiveRecord::Relation
वस्तुfind
के साथ , एक एकल रिकॉर्ड, जो इसके प्राथमिक कॉलम (आमतौर परid
. द्वारा पाया जाता है) ), अगर नहीं मिला तो एक अपवाद उठाता है
दूसरे शब्दों में :
यदि आप एक रिकॉर्ड (एक विशिष्ट उपयोगकर्ता) की अपेक्षा कर रहे हैं, तो find_by
use का उपयोग करें , एकाधिक रिकॉर्ड (उपयोगकर्ताओं की एक सूची) के लिए where
. का उपयोग करें ।
लेकिन where
इसका उपयोग करने के कई तरीके हैं, जो अक्सर शुरुआती लोगों को भ्रमित करते हैं।
कोई बात नहीं!
हम उन विभिन्न तरीकों पर एक नज़र डालने जा रहे हैं जिनका उपयोग आप where
. कर सकते हैं आपके रेल अनुप्रयोगों में।
बेसिक वेयर कंडीशंस
where
. का उपयोग करने का उद्देश्य एक क्वेरी बनाना है जो आपके डेटाबेस में जानकारी को फ़िल्टर करती है, ताकि आपको केवल वही पंक्तियाँ मिलें जो आप चाहते हैं।
उदाहरण के लिए :
एक Book
दिया गया मॉडल, title
. के साथ , author
&category
।
हो सकता है कि आप किसी विशिष्ट लेखक की सभी पुस्तकों, या किसी विशेष श्रेणी के अंतर्गत दायर सभी पुस्तकों का पता लगाना चाहें।
यहां एक प्रश्न है :
Book.where(category: "Ruby")
यह सभी पुस्तकों को category
. के साथ लौटाता है "रूबी" का।
आप शर्तों को भी जोड़ सकते हैं।
इसे पसंद करें :
Book.where(category: "Ruby", author: "Jesus Castello")
यह उन पुस्तकों को लौटाता है जो category
. दोनों से मेल खाती हैं और author
।
और आप where
combine को जोड़ सकते हैं एक दायरे के साथ।
# scope definition class Book scope :long_title, -> { where("LENGTH(title) > 20") } end # controller code @books = Book.long_title.where(category: "Ruby")
हैश का उपयोग करना (fruit: "apple"
), आपको यह जांचने की अनुमति देता है कि कोई कॉलम किसी चीज़ के बराबर है या नहीं।
लेकिन क्या होगा अगर आप समानता की तलाश नहीं कर रहे हैं?
फिर आपको एक स्ट्रिंग का उपयोग करना होगा।
रेल कहां:इससे बड़ा और इससे कम
अगर आप "इससे बड़ा", "इससे कम", या ऐसा कुछ देखना चाहते हैं...
इसे इस तरह करें :
Book.where("LENGTH(title) > 20")
यदि आपको मूल्यों को प्रक्षेपित करने की आवश्यकता है…
इसे इस तरह करें :
Book.where("LENGTH(title) > ?", params[:min_length])
यह ?
इसे "प्लेसहोल्डर" कहा जाता है, और इसका उपयोग सुरक्षा के लिए "एसक्यूएल इंजेक्शन" हमलों से बचने के लिए किया जाता है।
एक अन्य विकल्प नामित प्लेसहोल्डर का उपयोग करना है।
उदाहरण :
Book.where("LENGTH(title) > :min", min: params[:min_length])
मुझे यह प्रश्न चिह्न प्लेसहोल्डर की तुलना में कम सामान्य लगता है, लेकिन यह कई प्रक्षेपित मूल्यों वाले प्रश्नों के लिए उपयोगी हो सकता है।
कहां नहीं और कहां या शर्तों का उपयोग कैसे करें
आइए अधिक जटिल प्रश्नों को देखें।
यदि आप यह जांचना चाहते हैं कि कोई शर्त सत्य नहीं है, तो आप where
. को जोड़ सकते हैं not
. के साथ विधि।
यहां एक उदाहरण दिया गया है :
Book.where.not(category: "Java")
एक और उदाहरण :
Book.where.not(title: nil)
यह Book
ढूँढता है एक title
के साथ यह nil
नहीं है ।
OR शर्त के बारे में क्या?
आप where
combine को जोड़ सकते हैं or
. के साथ दो या दो से अधिक स्थितियों में से किसी एक से मेल खाने वाली पंक्तियों को प्राप्त करने की विधि।
यहां बताया गया है कि यह कैसे काम करता है :
Book.where(category: "Programming").or(Book.where(category: "Ruby"))
यह दो को जोड़ती है where
एक में पूछताछ।
इसे आज़माएं!
रेल जहां सरणी उदाहरण में है
हमने जो भी उदाहरण देखे हैं, वे एक विशिष्ट मान की तलाश में हैं।
लेकिन आप कई मानों की तलाश कर सकते हैं।
कैसे?
एक सरणी का उपयोग करना!
उदाहरण :
Book.where(id: [1,2,3])
यह एक "IN" क्वेरी उत्पन्न करता है जो एक ही समय में, इन सभी आईडी को खोजेगा।
SELECT "books".* FROM "books" WHERE "books"."id" IN (1, 2, 3)
आपको यह प्रश्न रेल लॉग में मिलेगा।
रेल एसोसिएशन कंडीशन में शामिल होता है
यदि आप किसी संबद्धता मान के आधार पर मिलान करना चाहते हैं, तो आपको उस संबद्धता को joins
के साथ उपलब्ध कराना होगा विधि।
तब आप यह कर सकते हैं :
Book.joins(:comments).where(comments: { id: 2 })
इस क्वेरी के साथ आपको सभी पुस्तकें मिलती हैं, जिनमें एक टिप्पणी होती है, और टिप्पणी id
. होती है है 2
।
स्ट्रिंग संस्करण के लिए :
Book.joins(:comments).where("comments.id = 2")
जहां comments
तालिका का नाम है, और id
स्तंभ नाम है।
एक जैसी स्थिति के साथ अंदर के टेक्स्ट को कैसे खोजें
यदि आप एक खोज फ़ंक्शन को लागू करना चाहते हैं, तो आप आंशिक मिलान की अनुमति देना चाह सकते हैं।
आप इसे "LIKE" क्वेरी के साथ कर सकते हैं।
यहां एक उदाहरण दिया गया है :
Book.where("title LIKE ?", "%" + params[:q] + "%")
यह उन सभी शीर्षकों को ढूंढता है जिनमें खोज टेक्स्ट होता है, जो पैराम्स (params[:q]
) द्वारा प्रदान किया जाता है। ), शीर्षक के अंदर कहीं भी।
बहुत उपयोगी प्रश्न!
प्रतिशत चिह्न क्या है? ?
SQL में, %
एक वाइल्डकार्ड वर्ण है।
वीडियो:कहां बनाम Find_B विस्तार से
सारांश
आपने सीखा है कि रेल का उपयोग कैसे किया जाता है where
अपने ActiveRecord
. को क्वेरी करने की विधि मॉडल!
सहित :
- कई स्थितियों के आधार पर फ़िल्टर कैसे करें
- कई पंक्तियों को कुशलतापूर्वक खोजने के लिए सरणियों का उपयोग कैसे करें
- कैसे उपयोग करें
where
or
. के संयोजन में ¬
अधिक जटिल प्रश्न लिखने के तरीके
अब इसे व्यवहार में लाने की आपकी बारी है।
पढ़ने के लिए धन्यवाद