2011-07-05 17 views
0

這裏是紅寶石哈希:如何重命名的鍵,以便他們強調

a = { 
    :testOne => 1, 
    :testTwo => 2 
} 

如何重命名的鍵,以便他們強調?

a = { 
    :test_one => 1, 
    :test_two => 2 
} 

肯布魯姆讓我在這裏正確的道路。您確實需要ActiveSupport或Rails3。然而,您不需要此解決方案的任何特定寶石:

hash = Hash[a.map {|k,v| [k.to_s.underscore.to_sym, v]}] 

謝謝!

+1

的ActiveSupport的瑰寶,但使用的寶石是不是天生壞,只要因爲它是非常受歡迎的,如ActiveSupport。更大的問題是,ActiveSupport是一個非常大的寶石,所以你只需要抓住你需要的部分:'require'active_support/core_ext/string/inflections''。 –

回答

3
Hash[a.map { |k,v| [k.to_s.downcase.sub('test','test_').to_sym, v] }] 

更新:如果你需要找到共同的根弦,你可以使用這個:

root = a.keys.inject do |m, e| 
    s = m.to_s 
    s.chop! while !e.to_s.start_with? s 
    s 
    end 
+0

謝謝,這是怎麼比我從Ken的答案調整的解決方案更好? – s84

+2

正如你所看到的,這不會使用屬於其他寶石一部分的'underscore'或'to_h'方法。 @DigitalRoss在這裏提供的內容並不需要,但會做你所查詢的轉換。 – Ryanmt

+1

@DigitalRoss ftw! :-) –

2

這個答案需要facet gem和activesupport(這是rails的一部分)。

require 'active_support' 
require 'facets' 

a.map{|k,v| [k.to_s.underscore.to_sym, v]}.to_h 
#     ^^^^^^^^^^^    ^^^^ from facets 
#     from activesupport 
+0

謝謝!但我正在尋找一種方法來做到這一點沒有寶石。 – s84

+0

+1,我刪除我的答案,你更快。使用哈希[...]方面不可用。請注意,這也創建了一個新的散列(這是正確的做法!) – tokland

+1

Camelcase以下劃線代碼可以在這個問題的答案中找到。 http://stackoverflow.com/questions/1509915/converting-camel-case-to-underscore-case-in-ruby – GregA100k

相關問題