2011-03-12 5 views
9

में सभी रिकॉर्ड के लिए मास डाउनकेस फ़ील्ड जब मैंने पहली बार उपयोगकर्ता मॉडल लागू किया, तो मैंने उपयोगकर्ता को अपनी लॉगिन जानकारी के लिए ऊपरी या लोअरकेस ईमेल टाइप करने की अनुमति दी। समस्या यह है कि यह एक मोबाइल ऐप है, और कभी-कभी ऑटोकैप्स होता है ताकि उपयोगकर्ता प्रमाणीकृत न हो। मैंने पहले ईमेल को कम करने के लिए CREATE विधि बदल दी है। हालांकि, यह मौजूदा खातों वाले लोगों को लगाताररेल

का कारण बनता है तो मैं उपयोगकर्ता तालिका में ईमेल फ़ील्ड को बड़े पैमाने पर अपडेट करने के लिए माइग्रेशन कैसे जोड़ सकता हूं?

class DowncaseEmail < ActiveRecord::Migration 
    def up 
    User.all.each do |user| 
     user.update_attributes :email => user.email.downcase 
    end 
    end 
end 

दूसरों के रूप में उल्लेख किया है, यह सबसे कारगर समाधान नहीं है:

+2

ईमेल पते के साथ जा सकते केस-संवेदी होते हैं, इसलिए वे हमेशा तुलना और भंडारण के लिए लोअर केस को जोड़ दिया जाना चाहिए। यह उन चीजों में से एक है जो ऐप डिज़ाइन के दौरान अनदेखी हो जाती है ... एक बार ... तो आपको इसे बाद में याद है। :-) –

उत्तर

5

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

एक अधिक जटिल है लेकिन अभी भी पोर्टेबल समाधान कुछ db विशिष्ट कार्यों पर निर्भर करता है:

class DowncaseEmail < ActiveRecord::Migration 
    def up 
    if %w[MySQL PostgreSQL].include? ActiveRecord::Base.connection.adapter_name 
     execute "UPDATE users SET email = LOWER(email)" 
    else 
     User.all.each do |user| 
     user.update_attributes email: user.email.downcase 
     end 
    end 
    end 
end 

दोनों Postgres और MySQL समर्थन LOWER कार्य करते हैं। SQLite भी इसका समर्थन करता है, लेकिन केवल एसीआई एन्कोडिंग के लिए जो ईमेल के लिए शायद ठीक है, लेकिन बग का कारण बन सकता है (क्योंकि कुछ ईमेल में अन्य वर्ण हो सकते हैं)। रेल भी संभावित रूप से किसी भी डेटाबेस का समर्थन करता है, इसलिए इन कार्यों पर भरोसा करने से आपका ऐप एक विशिष्ट डीबी में बंद हो सकता है।

21

रूबी इटरेटर का उपयोग करने से बचने के लिए सबसे प्रभावी तरीका होगा, और इसे सीधे SQL में करें।

एक सामान्य पलायन फ़ाइल के अंदर आप MySQL के लिए इस एसक्यूएल का उपयोग कर सकते हैं:

execute("UPDATE users SET email = LOWER(email)") 
+0

आमतौर पर कुछ कोड होंगे जिन्हें अतिरिक्त रूप से बदला जाना चाहिए, इसलिए तुलना निम्न-मामले में होती है, और नए डाले गए रिकॉर्ड को समस्या को पुन: संसाधित करने के लिए निम्न-मामले में जोड़ दिया जाता है। –

2

कभी कुछ है कि आप केवल एक बार ऐसा करने के लिए जा रहे हैं के अनुकूलन के बारे में चिंता। जब तक आपके पास बड़ी संख्या में उपयोगकर्ता नहीं हैं, तो केवल उस पद्धति का उपयोग करें जो आपके लिए सबसे परिचित होगा।

+0

समाधान के लिए सभी को धन्यवाद। मेरे पास केवल 300 उपयोगकर्ता थे, इसलिए बस एक साधारण प्रवास करना मेरे लिए सबसे आसान था। चीयर्स। – JBlake

2

(हालांकि मैं सिर्फ SQL क्वेरी चल रहा है। सिफारिश करेंगे) आप बस

User.update_all('email = lower(email)') 
+0

इस समाधान से प्यार है। – nfriend21