2011-11-02 10 views
6

मेरी तालिका फ़ील्ड के नाम लोअरकेस हैं और सीएसवी फाइलों से प्राप्त फ़ील्ड नाम कैमेलकेस हैं। क्या वैसे भी मैं हैश की सरणी की चाबियों को लोअरकेस में परिवर्तित कर सकता हूं?हैश कुंजी को लोअरकेस में कनवर्ट करें - रुबी शुरुआत

यहाँ कोड मैं अभी है:

CSV.foreach(file, :headers => true) do |row| 
     Users.create!(row.to_hash) 
    end 

इसका कारण यह है कुंजी ऊंट मामले हैं विफल हो रहा है (मैं मैन्युअल रूप से शीर्ष लेख पंक्ति सभी लोअरकेस बनाने के लिए फ़ाइल का संपादन करके इस की पुष्टि कर लें)।

पीएस। इसके अलावा मुझे यह जानना अच्छा लगेगा कि क्यों रेल रेल टेबल नामों के मामले में केस संवेदनशीलता शुरू करते हैं?

उत्तर

11

आप कुछ इस तरह का उपयोग कर सकते हैं:

CSV.foreach(file, :headers => true) do |row| 
    new_hash = {} 
    row.to_hash.each_pair do |k,v| 
    new_hash.merge!({k.downcase => v}) 
    end 

    Users.create!(new_hash) 
end 

मैं इसे परीक्षण करने के लिए समय नहीं था लेकिन, आप इसे करने के विचार ले सकते हैं।
आशा है कि इससे

+0

काम करता है यही कारण है कि! लेकिन मैं भी उत्सुक हूं कि हेक रेल क्यों मामले को लागू करेंगे (मेरी फाइल सिस्टम केस संवेदनशील नहीं है इसलिए यह मुद्दा नहीं है)। – Hopstream

+0

क्षमा करें, लेकिन मुझे यह नहीं पता कि आपका क्या मतलब है: रेल टेबल फ़ील्ड नाम 'केस संवेदनशीलता के साथ शुरू करने के लिए लेता है? :) (शायद यह मेरा बुरा अंग्रेजी ज्ञान है :)) – bor1s

+0

मतलब प्रविष्टि – Hopstream

1

मैं सीधे हैश को मर्ज करने से अधिक कुशल, जोड़ दूंगा! क्योंकि आप हर जोड़ी के लिए एक नया हैश नहीं बना रहे हैं।

CSV.foreach(file, :headers => true) do |row| 
    new_hash = {} 
    row.to_hash.each_pair do |k,v| 
    new_hash[k.downcase] = v 
    end 

    Users.create!(new_hash) 
end 
3

रूबी 1.9 एक अस्थायी चर initialising से परहेज करने के लिए each_with_object उपयोग करते हुए, इस लक्ष्य को हासिल करने के लिए काफी एक अच्छा तरीका प्रदान करता है।

CSV.foreach(file, :headers => true) do |row| 
    new_hash = row.each_with_object({}) do |(k, v), h| 
    h[k.downcase] = v 
    end 

    Users.create!(new_hash) 
end 
21

तुम बस सीएसवी साथ header_converters विकल्प का उपयोग कर सकते हैं:

CSV.foreach(file, :headers => true, :header_converters => lambda { |h| h.try(:downcase) }) do |row| 
    Users.create!(row.to_hash) 
end 

महत्वपूर्ण एक खाली हैडर के बाद से वहाँ में .try डाल करने के लिए एक अपवाद फेंक देते हैं। हर पंक्ति पर ऐसा करने से ज्यादा बेहतर (और तेज़)।

0

मैंने पाया कि यह समाधान काफी तेज है और थोड़ा और "रूबीश" है।

CSV.foreach(file, :headers => true) do |row| 
    new_hash = Hash[row.to_hash.map { |k, v| [k.downcase, v] }] 
    Users.create!(new_hash) 
end 
+0

यह सुनिश्चित नहीं है कि यह अधिक रूबीश है - यह कक्षा या मॉड्यूल विधि का उपयोग करता है जो कि समाप्त होने वाली विधि का भी उपयोग करता है! – shevy

2

मैं इस दृष्टिकोण और अधिक सुरुचिपूर्ण लगता है:

hash_with_camelcase_keys.to_a.map { |pair| [pair.first.downcase, pair.last] }.to_h 
3

इस के बाद से रेल के साथ टैग किया गया।

सक्रिय समर्थन के साथ vom संस्करण 3.0 शुरू करने के साथ आप HashWithIndifferentAccess का उपयोग कर सकते हैं।

इससे चाबियाँ या आपके हैश तक पहुंचने के लिए निचले/अपरकेस/प्रतीक लेखन की अनुमति होगी।

my_hash = { "camelCase": "some value" } 
my_hash.with_indifferent_access[:camelcase] # 'some value' 
my_hash.with_indifferent_access['camelcase'] # 'some value' 
my_hash.with_indifferent_access['camelCase'] # 'some value' 
my_hash.with_indifferent_access['CAMELCASE'] # 'some value' 

ActiveSupport 4.0.2 भी इस की शुरुआत की:

my_hash.deep_transform_keys!(&:downcase) 
# or if your hash isn't nested: 
my_hash.transform_keys!(&:downcase) 
+2

'with_indifferent_access' स्ट्रिंग-या-प्रतीक का समर्थन कर रहा है, लेकिन मेरे लिए * असंवेदनशील नहीं है *। ActiveSupport 5.0.4। –

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