को महत्व देता है क्या चोको कहा कि अगर आप एक सरणी नहीं एक सक्रिय रिकॉर्ड उदाहरण चाहते हैं काम करेंगे। यदि आप एक सक्रिय रिकॉर्ड उदाहरण चाहते हैं, तो करें:
User.where(id: 5).select(:id, :first_name).take
यहां कुछ और जानकारी दी गई है। मुझे यकीन नहीं है कि आप कितना जानते हैं/नहीं जानते हैं, इसलिए मैं आपको अधिक से अधिक कम जानता हूं।
मुझे लगता है कि आप समझ रहे हैं कि आप ऊपर क्या कर रहे हैं विधि विधि है - यानी, आप एक विधि बुला रहे हैं, फिर पहली विधि के परिणाम पर एक और विधि बुला रहे हैं। उदाहरण के लिए:
User.find_by(id: 5).attributes.slice('id', 'first_name')
आप User
वर्ग पर find_by_id
विधि कॉल कर रहे हैं। यह विधि उदाहरणUser
कक्षा (यानी, एक सक्रिय रिकॉर्ड उदाहरण) लौटाएगी। उस उदाहरण में attributes
नामक एक विधि है, जिसे आप कॉल करते हैं। attributes
विधि Hash
वर्ग का एक उदाहरण देता है, जो पिछले सक्रिय रिकॉर्ड उदाहरण में फ़ील्ड का प्रतिनिधित्व करता है। Hash
में slice
विधि है, जिसे आप बदले में कॉल करते हैं। slice
विधि Hash
का एक और उदाहरण देता है, जिसमें आपके द्वारा निर्दिष्ट फ़ील्ड का सबसेट शामिल है।
तो, इस अवधारणा को स्पष्ट करने के लिए यह है कि जब आप तरीकों की श्रृंखला बना रहे हैं, तो आप एक ही चीज़ पर प्रत्येक आगामी विधि को कॉल नहीं कर रहे हैं - आप इसे श्रृंखला में पिछली विधि के वापसी मूल्य पर कॉल कर रहे हैं ।
ठीक है, के साथ इतना है कि रास्ते से बाहर:
सभी find
तरीकों डेटाबेस क्वेरी और एक सक्रिय रिकॉर्ड मॉडल, या एक सादे गहरे लाल रंग का सक्रिय रिकॉर्ड के कई उदाहरण युक्त सरणी का एक उदाहरण वापस जाने के लिए करना है मॉडल के।
कई अन्य विधियां - select
, where
, आदि, तुरंत डेटाबेस को हिट न करें, और एक सक्रिय रिकॉर्ड उदाहरण वापस करने का इरादा नहीं है। वे सभी ActiveRecord::Relation
का एक उदाहरण लौटाते हैं।एक ActiveRecord::Relation
कुछ स्थितियों से मेल खाने वाले रिकॉर्ड के संभावित समूह की तरह है - और आप इसमें अतिरिक्त शर्तें जोड़ सकते हैं। यह 'डेटाबेस क्वेरी होने की प्रतीक्षा कर रहा है', या 'डेटाबेस क्वेरी जो अभी तक हो सकती है या नहीं हो सकती है' जैसी है।
जब आप फोन एक विधि where
, order
, या select
ActiveRecord::Relation
पर की तरह, यह ActiveRecord::Relation
का एक उदाहरण वापस आ जाएगी, जिसका अर्थ है आप एक ही कक्षा का एक उदाहरण मिल गया है, और यह कर सकते हैं अच्छी तरह से उस वर्ग से श्रृंखला तरीकों जैसे: User.where(name: 'Fred').select(:id, :name).order('name ASC')
ActiveRecord::Relation
का आपका उदाहरण बहुत स्मार्ट हो जाएगा, और डेटाबेस से टकराने परेशान नहीं करेगा जब तक आप एक विधि स्पष्ट रूप से इंगित करता है कि आप रिकॉर्ड अब चाहते हैं कहते हैं - इस तरह के each
, all
, take
, आदि
के रूप में तो, मैं यहां योजनाबद्ध से अधिक समय तक चला गया हूं, इसलिए मैं लपेटूंगा। यह टूट
User.where(id: 5).select(:id, :first_name).take
: के साथ एक टूट, भारी नीचे स्पष्टीकरण टिप्पणी की यहाँ, कोड मैं पहली बार उल्लेख किया है
my_relation = User.where(id: 5)
# The database will not have been hit yet - my_relation
# is a query waiting to happen
my_second_relation = my_relation.select(:id, :first_name)
# The database has STILL not been hit.
# the relation now contains both the conditions
# from the previous my_relation, and the new 'select'
# criteria we specified
my_user = my_second_relation.take
# OK, 'take' means we want the first record
# matching all our criteria,
# so my_second_relation will hit the database
# to get it, and then return an Active Record
# instance (ie, an instance of the User class)
वाह ... मैं पर चला गया अपेक्षा से अधिक समय। उम्मीद है कि इसमें से कुछ उपयोगी था!
आप कैसे एक ** सामान्य उपयोगकर्ता से एक ** अतिथि उपयोगकर्ता ** में अंतर करने में **? – Pavan