2011-09-23 12 views
8

के ऐरे के माध्यम से खोजें मै मैड्रिडस के माध्यम से कई आईडी प्राप्त कर लिया है। मैं कुछ मापदंडों के आधार पर उन आईडी हल कर लिया है और अब मैं इस विशेष क्रम में उन वस्तुओं को पाने के लिए की जरूरत है:Mongoid: ids

MyModel.find(ids) 

है न? लेकिन ऑब्जेक्ट्स ऑर्डर नहीं करता है ऑर्डर में नहीं है। ऐसा लगता है कि यह सिर्फ एक ही

रूप
MyModel.where(:_id.in => ids) 

जो संग्रहीत आईडी के रूप में सिर्फ एक ही क्रम में लाई गई वस्तुओं को वापस नहीं होगा।

अब मैं इस

ids.map{|id| MyModel.find(id)} 

जो काम करेगा कर सकते हैं, लेकिन यह डेटाबेस कई कई बार दस्तक देगा।

उत्तर

9

आप अपनी सभी वस्तुओं के बाद हाथ से ऑर्डर कर सकते हैं। कुछ इस तरह:

ordering = { } 
ids.each_with_index { |id, i| ordering[id] = i } 
objs = MyModel.find(ids).sort_by { |o| ordering[o.id] } 
+1

क्या यह तेजी से प्रत्येक आइटम को डीबी से ला रहा है? – fl00r

+0

@ fl00r: यह वांछित क्रम में चीजों को प्राप्त करने के लिए मॉडल और एक साधारण प्रकार (श्वार्टज़ियन ट्रांसफॉर्म में निर्मित के साथ) लाने के लिए केवल एक मोंगोडीबी पहुंच होना चाहिए। डाटाबेस का उपयोग आमतौर पर महंगा हिस्सा होता है। इसे बेंचमार्क करने का प्रयास करें, वास्तविक डेटा तक पहुंच के बिना कुछ भी गारंटी देना मुश्किल है। –

+0

@muistooshort, मुझे एक समान समस्या का सामना करना पड़ रहा है। आम तौर पर, क्या यह सच है कि डीबी हिट को कम करने के लिए यह बेहतर अभ्यास होगा? –

10

एक ऐसी ही समस्या पर काम और थोड़ा अधिक संक्षिप्त समाधान पाया गया था:

objs = MyModel.find(ids).sort_by{|m| ids.index(m.id) } 

मूल रूप से बस प्रकार ब्लॉक का उपयोग तत्व के सूचकांक रोड़ा करने के लिए।