2011-09-17 12 views
10

वहाँ केस संवेदी खोजों के लिए mongoid में एक विशेषता सेट करने के लिए कोई तरीका है? IAmGreat और मैं इसे butchering और यह iamgreat में परिवर्तन किए बिना उनके अद्वितीय उपयोगकर्ता नाम का उपयोग उन डेटा खोजने के लिए चाहते हैं:प्रकरण mongoid में शब्दों के लिए असंवेदनशील खोज

का कहना है कि किसी को एक उपयोगकर्ता नाम है देता है।

धन्यवाद

उत्तर

1

क्यों नहीं बस नीचे एक User.login.downcase (या जो भी अपने मॉडल/विशेषता संयोजन है) जब तुलना कर रहे हैं? यह DB में पूंजीकरण छोड़ देंगे के रूप में है, लेकिन सिर्फ तुलना के लिए क्षेत्र downcase।

46

वास्तव में आप केस संवेदी खोज सकते हैं। लेकिन आपको एक रेगेक्स के साथ खोजना है! यहाँ एक उदाहरण है कि कैसे मैं http://www.VersionEye.com

User.first(conditions: {email: /^#{email}$/i}) 

में यह उपयोग कर रहा हूँ "/" आप शुरू करने और regex समाप्त कर रहे हैं के साथ है। रेगेक्स के बाद "i" का अर्थ असंवेदनशील है। "^" मतलब तत्व खोज स्ट्रिंग और "$" के साथ शुरू करने के लिए है इसका मतलब तत्व खोज स्ट्रिंग के साथ समाप्त करने के लिए है। यदि आप एक सटीक मिलान की तलाश में हैं तो यह महत्वपूर्ण है।

User.where(username: /#{username}/i).first 
+10

: आप अगर यह आपके regex को साफ़ करने में आवश्यकता हो सकती है उपयोगकर्ता इनपुट शामिल है: '/^# {Regexp.escape (ईमेल)} $/i' – Andrew

+1

उपयोगकर्ता = जहां (ईमेल: /^#{email}$/i).first – shilovk

5

तुम भी तरह कुछ कोशिश कर सकते हैं FYI करें

@user = User.where({:username => /.*#{name}.*/i })

+0

(1) यह केस- असंवेदनशील समानता (2) वह (AFAIK) संग्रह की जांच करने के लिए एक सूचकांक का उपयोग नहीं करेगा, इसलिए यह बहुत महंगा हो सकता है। –

+0

हाँ। यह डिफ़ॉल्ट क्वेरी से 50% धीमी है। लेकिन यह केस-असंवेदनशील समानता की जांच करता है। – mrudult

+1

नहीं, यह समानता की जांच नहीं करता है। आपके रेगेक्स में कोई एंकर नहीं है। –

2

अगर आप रेल का उपयोग कर रहे या mongoid आप एफएफ कोशिश कर सकते हैं:

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