2014-11-20 10 views
25

से विशिष्ट विशेषताओं को प्राप्त करें मान लें कि मेरे पास User मॉडल :id, :first_name, :last_name, and :email विशेषता वाले मॉडल हैं। मेरे आवेदन में, अतिथि उपयोगकर्ताओं को User's email and last_name नहीं देखना चाहिए। मैं विशिष्ट मान चुनने के लिए कैसे अगर मैं उपयोगकर्ताओं की सूची चाहते हैं पता है, लेकिन मैं कैसे मैं की तरह है कि करने के लिएActiveRecord मॉडल

User.find_by(id: 5).select(:id, :first_name). 

एक समाधान एक विशिष्ट उपयोगकर्ता की विशिष्ट विशेषताओं प्राप्त कर सकते हैं पता नहीं है उपयोगकर्ता के लिए है

User.find_by(id: 5).attributes.slice('id', 'first_name') 

लेकिन फिर मुझे एआर रिकॉर्ड के बजाय हैश मिलता है। मैं कर सकता

User.select(:id, :first_name).find_by(id: 1) 

लेकिन बात यह है कि मैं जो फिल्टर मैं के बाद से मैं उपयोगकर्ता पहले पता करने की जरूरत फ़िल्टर करना चाहिए पता नहीं है।

क्या आप मेरी मदद कर सकते हैं?

+0

आप कैसे एक ** सामान्य उपयोगकर्ता से एक ** अतिथि उपयोगकर्ता ** में अंतर करने में **? – Pavan

उत्तर

62

को महत्व देता है क्या चोको कहा कि अगर आप एक सरणी नहीं एक सक्रिय रिकॉर्ड उदाहरण चाहते हैं काम करेंगे। यदि आप एक सक्रिय रिकॉर्ड उदाहरण चाहते हैं, तो करें:

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, या selectActiveRecord::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) 

वाह ... मैं पर चला गया अपेक्षा से अधिक समय। उम्मीद है कि इसमें से कुछ उपयोगी था!

+0

उत्कृष्ट ...... – Filippos

+4

ActiveRecord :: रिलेशनशिप I के सर्वोत्तम स्पष्टीकरणों में से एक मैंने कभी पढ़ा है! धन्यवाद!! – thenextmogul

13

इस प्रयास करें:

User.where(id: 5).pluck(:id, :first_name) 

यह रिटर्न सरणी युक्त आईडी और first_name

2

हो जाएगा ताकि रूप में अच्छी तरह से काम करता है

User.select(:id, :first_name).find(5)