2012-05-07 10 views
10

प्रदर्शन कारण के लिए, मैं जब आदेश क्षेत्रों मैं लोड करना चाहते हैं निर्दिष्ट करने के लिए में एक mongoid क्वेरी लिखाई संभव only() कीवर्ड के रूप में के रूप में अक्सर इस्तेमाल करते हैं। जब मैं केवल प्रदर्शन प्रयोजनों के लिए अपने सभी व्यवस्थापक के एक उपयोगकर्ता के ईमेल चाहतेMongoid: किसी ऑब्जेक्ट के केवल कुछ फ़ील्ड को लोड करने के लिए आप संदर्भ के माध्यम से आलसी लोड कैसे लोड करते हैं?

सामान्य संदिग्ध, उदाहरण के लिए है।

मैं लिखने होगा:

User.where(:groups => :admins).only(:email).each do |u| 
puts u.email 
end 

मैं यह कर, क्योंकि मेरे उपयोगकर्ता मॉडल डेटा है कि मैं खुशी अनदेखा कर सकते हैं जब ईमेल का एक समूह लिस्टिंग के एक बहुत की काफी भरे हुए हैं।

हालांकि, अब कल्पना करें कि मेरे उपयोगकर्ताओं को एक परियोजना मॉडल के माध्यम से संदर्भित किया गया है, ताकि प्रत्येक प्रोजेक्ट के लिए मैं कर सकूं: project.user। मैंगॉइड की आलसी लोडिंग के लिए धन्यवाद, जब मैं संदर्भ पर कॉल करता हूं तो मेरा ऑब्जेक्ट उपयोगकर्ता केवल तत्काल (और डीबी से पूछताछ) प्राप्त करेगा।

लेकिन क्या होगा अगर मैं उदाहरण के लिए सभी व्यवस्थापक परियोजना के मालिक के सभी ईमेल सूचीबद्ध करना चाहते हैं?

मैं इस बारे में होगा:

Project.where(:admin_type => true).each do |p| 
    puts p.user.email 
end 

बड़ी समस्या यहां है कि इस कर रही है, मैं प्रत्येक परियोजनाओं के लिए पूरे उपयोगकर्ता वस्तु लोड करते हैं, और अगर वहाँ क्वेरी से मेल खाने परियोजना के बहुत सारे है कि बहुत भारी हो सकता है कर रहे हैं । तो मैं केवल ईमेल कैसे लोड करूं?

मैं ऐसा कर सकता है:

User.where(:_id => p.user_id).only(:email).first.email 

लेकिन यह स्पष्ट रूप से बस करने का अच्छा वाक्य रचना का उद्देश्य विफल:

p.user.email 

काश मैं की तरह कुछ लिख सकते हैं: p.user.only(:email).email, लेकिन मैं यह कर सकते हैं 'टी। कोई विचार ?

एलेक्स

उत्तर

6

Mongoid के निर्माता से जवाब। अभी तक यह संभव नहीं है। इसे फीचर अनुरोध के रूप में जोड़ा गया है।

+1

क्या यह अभी तक लागू किया गया है? क्या गिटहब पर कोई मुद्दा इस के लिए मौजूद है? –

+0

इसे प्लक कमांड के साथ जोड़ा गया है। User.all.pluck (: id)। Http://backkovic पर क्रेडिट http://stackoverflow.com/a/9991754/1050054 –

2

मुझे लगता है कि आपको यहां denormalize करने की आवश्यकता है। सबसे पहले, A Note on Denormalization पढ़ें।

आप mongoid घटनाओं का उपयोग कर स्वयं के द्वारा असमान्यीकरण लागू करने या महान mongoid_denormalize मणि उपयोग कर सकते हैं। यह बहुत सीधी है और इसे लागू करने के बाद आप p.user_email या अपने प्रश्नों में कुछ उपयोग कर सकते हैं।

+0

धन्यवाद, कि एक दिलचस्प तरीका है। मैंने इसे माना था (mongoid_denormalize के साथ नहीं जिसे मैं नहीं जानता था), लेकिन सामान्य denormalization। मैंने इसके साथ जाने का फैसला क्यों किया, यह है कि परियोजना के उपयोगकर्ता ईमेल को प्रदर्शित करने की आवश्यकता दुर्लभ है और अधिकांश आंतरिक व्यवस्थापक इंटरफ़ेस में उपयोग की जाती है। मुद्दा इस तथ्य के साथ आता है कि यह कई परियोजनाओं के साथ पेजिनेटेड है, वहां बहुत सारे उपयोगकर्ता लोड की आवश्यकता है। यही कारण है कि एक .only() मेरी विशेष समस्या को हल करेगा – Alex

संबंधित मुद्दे

 संबंधित मुद्दे