2012-08-04 14 views
9

मैं रेल सीखने की कोशिश कर रहा हूं [coursera में SAAS पाठ्यक्रम का पालन करके] और ActiveRecord का उपयोग करके सरल मूवी तालिका के साथ काम कर रहा हूं।रेल: ActiveRecord डीबी सॉर्ट ऑपरेशन केस असंवेदनशील

मैं शीर्षक वाली शीर्षक वाली सभी फिल्में प्रदर्शित करना चाहता हूं। मैं इसे असंवेदनशील रूप से हल करना चाहता हूं।

Movie.all(:conditions => ["lower(title) = ?", title.downcase],:order => "title DESC") 
=>undefined local variable or method `title' for #<MoviesController:0xb4da9a8> 

मुझे लगता है कि यह does not कम (शीर्षक) पहचान:

मैं इसे इस तरह से कर रही है की कोशिश की।

क्या केस केसिसिटिव सॉर्ट प्राप्त करने का यह सबसे अच्छा तरीका है?

धन्यवाद!

उत्तर

16

उपयोग where और नहीं all

Movie.where("lower(title) = ?", title.downcase).order("title DESC") 

वास्तव में तरह समझ में नहीं आ यद्यपि। यहां आपको title.downcase के बराबर शीर्षक के साथ सभी फिल्में मिलेंगी। सब कुछ बराबर है, आप इसे title desc द्वारा कैसे क्रमबद्ध कर सकते हैं?

लोअरकेस शीर्षक से रिवर्स वर्णानुक्रम सभी फिल्मों क्रमबद्ध करने के लिए:

Movie.order("lower(title) DESC").all 
3

होने MySQL अपर या लोअर केस आपरेशन हर बार प्रदर्शन काफी महंगा है।

मुझे सलाह है कि title कॉलम और title_lower कॉलम हो। इस तरह, आप title_lower कॉलम पर केस असंवेदनशीलता के साथ आसानी से प्रदर्शित और सॉर्ट कर सकते हैं जब भी MySQL आपके द्वारा सॉर्ट किए जाने पर ऊपरी या निचले भाग को निष्पादित करता है।

दोनों या कम से कम title_lower सूचकांक को याद रखें।

5

आप ऐसा करने के लिए है:

Movie.order("lower(title) DESC").all 
0

एक और अधिक मजबूत समाधान अरेल नोड्स उपयोग करने के लिए है। मैं Movie मॉडल पर एक जोड़े को स्कोप परिभाषित करने की सलाह देते हैं:

scope :order_by_title, -> { 
    order(arel_table['title'].lower.desc) 
} 

scope :for_title, (title)-> { 
    where(arel_table['title'].lower.eq title.downcase) 
} 

और फिर Movie.for_title(title).order_by_title

सूचीबद्ध अन्य उत्तर से अधिक लाभ यह है कि .for_title और .order_by_titletitle स्तंभ उर्फ ​​अगर आप को तोड़ने नहीं होगा या फोन title कॉलम के साथ किसी अन्य तालिका में शामिल हों, और वे एसक्यूएल से बच निकले हैं।

रिकीपाई mentioned की तरह, यदि आपके पास कॉलम पर कोई अनुक्रमणिका नहीं है, तो डेटाबेस धीमा हो जाएगा। हालांकि, यह आपके डेटा की प्रतिलिपि बनाने और दूसरे कॉलम में एक ट्रांसफॉर्म लागू करने के लिए खराब (सामान्य) रूप है, क्योंकि तब एक कॉलम दूसरे के साथ सिंक हो सकता है। दुर्भाग्यवश, MySQL के पुराने संस्करणों ने ट्रिगर्स के अलावा कई alternatives की अनुमति नहीं दी थी। 5.7.5 के बाद आप ऐसा करने के लिए वर्चुअल generated columns का उपयोग कर सकते हैं। फिर असंवेदनशील मामलों के मामले में आप केवल जेनरेट किए गए कॉलम का उपयोग करते हैं (जो वास्तव में रूबी को अधिक सीधे आगे बनाता है)।

पोस्टग्रेस के पास इस संबंध में थोड़ा अधिक लचीलापन है, और आपको विशेष स्तंभ का संदर्भ दिए बिना कार्यों पर अनुक्रमित करने देगा, या आप कॉलम को केस असंवेदनशील कॉलम बना सकते हैं।

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