2010-06-06 5 views
44

के साथ रेल में केस-असंवेदनशील आदेश कैसे करें मैं अपने विकास पर्यावरण को sqlite3 से postgresql 8.4 पर स्विच करने की प्रक्रिया में हूं और एक आखिरी बाधा है।पोस्टग्रेस्क्ल

मेरे मूल में मेरे पास एक सहायक विधि में निम्न पंक्ति थी;

result = Users.find(:all, :order => "name collate NOCASE") 

जो एक बहुत अच्छा मामला-असंवेदनशील खोज प्रदान करता है। मैं postgresql के लिए इसे दोहराना नहीं कर सकता। आसान होना चाहिए - कोई विचार?

धन्यवाद।

उत्तर

77
result = Users.find(:all, :order => "LOWER(name)") 

ब्रैड और फ्रैंक दोनों से थोड़ा सा लेने के लिए।

+0

अच्छा, कि धन्यवाद काम किया। मेरे लिए इस बारे में थोड़ा और जानने के लिए सही दिशा में मुझे मजबूर किया। यूपीपीआर (नाम) का उपयोग करना भी काम करता है और वास्तव में यह है कि मेरे कोड में क्या समाप्त हुआ है - किसी विशेष कारण के लिए। – brad

+2

एक अधिक चरम समाधान जिसका मैंने सहारा लिया है, मूल स्तंभ को ट्रैक करने के लिए एक अतिरिक्त कॉलम होना है। डालने या अद्यतन पर ट्रिगर्स का उपयोग करके, उस कॉलम को संशोधित करें। मैंने पिछले कुछ बार इसका इस्तेमाल किया है, जहां मैं कुछ के शीर्षक को सॉर्ट करना चाहता था और "ए, ए, द" के प्रमुख शब्दों को गिनना नहीं चाहता था। मैंने सभी विशेष पात्रों को भी हटा दिया। इसके परिणामस्वरूप "शीर्षक", "एक शीर्षक", "! शीर्षक", "शीर्षक" एक दूसरे के बगल में बिखरे हुए के बजाय सॉर्टिंग हुआ। इसने क्रमबद्ध क्षेत्र को संपादित करना भी संभव बना दिया ताकि मैं "शीर्षक I" को "शीर्षक IX" से पहले आ सकूं। – LanceH

+1

यदि आपको इसे 'डिफ़ॉल्ट_स्कोप' पर चाहिए, तो 'डिफ़ॉल्ट_स्कोप ऑर्डर (' लोअर (नाम) एएससी 'का उपयोग करें) '। विनिर्देशों को समझने के लिए मुझे थोड़ा सा लगा। –

5

एसक्यूएल में आप ऑर्डर द्वारा लोअर (कॉलमनाम) का उपयोग कर सकते हैं, यह नहीं पता कि रूबी में इसे कैसे किया जाए। एक कार्यात्मक सूचकांक (लोअर (कॉलमनाम) पर भी) चीजों को गति देने में मदद करेगा।

6

क्या आपने अपना कॉलम citext प्रकार के रूप में संग्रहीत करने पर विचार किया है? यह वास्तव में कॉल को कम करने के लिए आंतरिक रूप से आंतरिक करता है() जैसा कि मैं इसे समझता हूं। यह बाद में आपके लिए स्वचालित होगा। यदि कई बार आपको केस संवेदनशील खोज की आवश्यकता होती है, तो यह शायद सबसे अच्छा विचार नहीं हो सकता है।

+0

दिलचस्प। यह मेरे लिए एक नया प्रकार है। कुछ पढ़ने से पता चलता है कि आपको इस सुविधा को 8.4 में सक्षम करने के लिए अलग से citext मॉड्यूल स्थापित करने की आवश्यकता है (लेकिन 9.0 में बनाया जाएगा)। यह मेरे कोड की पोर्टेबिलिटी को प्रभावित करेगा, इसलिए मैं इसे अभी छोड़ दूंगा। मुझे इस समय एक केस संवेदनशील खोज करने की आवश्यकता नहीं है, लेकिन मुझे लगता है कि मैं इस समय विकल्प खोलना चाहता हूं, इसलिए इसे अभी छोड़ दिया जाएगा। यह जानने के लिए बहुत उपयोगी है हालांकि धन्यवाद! – brad

23

LanecH के लोकप्रिय जवाब रेल के लिए अनुकूलित 3+ (रेल सहित 4):

users = User.order('LOWER(name)') 

# or create a named scope you can reuse 
class User < ActiveRecord::Base 
    scope :order_by_name, -> { order('LOWER(name)') } 
end 

users = User.order_by_name