रेल और इकट्ठा में रेल के बीच अंतर क्या है?


123

यहां दो सैंपल कोड हैं।

पहला वाला collect:

User.first.gifts.collect(&:id)

दूसरा वाला pluck:

User.first.gifts.pluck(:id)

क्या उनके बीच प्रदर्शन या कुछ और के बीच कोई अंतर है?

जवाबों:


230

pluckडीबी स्तर पर है। यह केवल विशेष क्षेत्र को क्वेरी करेगा। इसे देखें

जब तुम करोगे:

 User.first.gifts.collect(&:id)

आपके पास लोड किए गए सभी फ़ील्ड्स के साथ ऑब्जेक्ट हैं और आपको बस idएनुमरेबल पर आधारित विधि के लिए धन्यवाद मिलता है ।

इसलिए:

  • यदि आपको केवलid रेल 4 की जरूरत है , तो उपयोग करें ids:User.first.gifts.ids

  • यदि आपको केवल रेल्स 4 वाले कुछ क्षेत्रों की आवश्यकता है, तो उपयोग करें pluck:User.first.gifts.pluck(:id, :name, ...)

  • यदि आपको रेल 3 के साथ केवल एक क्षेत्र की आवश्यकता है, तो उपयोग करें pluck:User.first.gifts.pluck(:id)

  • यदि आपको सभी क्षेत्रों की आवश्यकता है , तो उपयोग करेंcollect

  • यदि आपको रेल 4 के साथ कुछ फ़ील्ड की आवश्यकता है, तब भी उपयोग करें pluck

  • अगर आपको रेल 3, उपयोग selectऔरcollect


"अगर आपको कुछ क्षेत्रों की आवश्यकता है, तो selectand collect का उपयोग करें" - क्या आप pluckकई गुणों के साथ उपयोग नहीं कर सकते हैं , जैसे pluck(:id, :name)?
अलेक्जेंडर

@AlexPopov - रेल 4 + pluckकई क्षेत्रों में आईएनजी का समर्थन करता है , रेल 3 नहीं करता है, जब तक कि आप रयान
लेफ़ेव्रे

3
रेल 4 में, यदि आपको केवल आवश्यकता है id, तो .idsरेफरी डॉक्टर का उपयोग करें : api.rubyonrails.org/classes/ActiveRecord/…
इवान चाऊ

30

हाँ। रेल गाइड के अनुसार , वस्तुओं के निर्माण के बिना, pluckडेटाबेस परिणाम को सीधे रूप में परिवर्तित करता है । इसका अर्थ है एक बड़ी या अक्सर चलने वाली क्वेरी के लिए बेहतर प्रदर्शन।arrayActiveRecord

@ माफी के जवाब के अलावा, pluckदोनों एकल और एकाधिक स्तंभ नामों को तर्क के रूप में ले सकते हैं:

Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]

3

मूल और मुख्य अंतर यह है कि प्लक डीबी स्तर पर लागू होता है और सभी डेटा प्राप्त करता है और फिर आपको रिकॉर्ड वापस कर देता है जब आपको सभी रिकॉर्डों का उपयोग करने की आवश्यकता होती है और जब कुछ फ़ील्ड तब प्लक का उपयोग करते हैं


2

यदि कोई ऐसा मामला है जहां आप पुनर्प्राप्त रिकॉर्ड की कुछ विशेषताओं का उपयोग कर रहे हैं। ऐसे मामलों में आपको उपयोग करना चाहिए pluck

User.collect(&:email)

उपरोक्त उदाहरण में यदि आपको केवल मेमोरी और समय बर्बाद कर रहे हैं तो आपको ईमेल विशेषता की आवश्यकता है। क्योंकि यह डेटाबेस में उपयोगकर्ता तालिका से सभी स्तंभों को पुनर्प्राप्त करेगा, प्रत्येक विशेषताओं के लिए मेमोरी आवंटित करता है (उन विशेषताओं को शामिल करता है, जिनका आप कभी उपयोग नहीं करेंगे)

नोट: pluckउपयोगकर्ता का ActiveRecord_Relation वापस नहीं करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.