Hop*_*eam 10 ruby ruby-on-rails ruby-on-rails-3
我的表字段名称是小写的,我从CSV文件获得的字段名称是camelcase.无论如何我可以将哈希数组的键转换为小写吗?
这是我现在的代码:
CSV.foreach(file, :headers => true) do |row|
Users.create!(row.to_hash)
end
Run Code Online (Sandbox Code Playgroud)
这是失败的,因为密钥是驼峰式的(我通过手动编辑文件来验证这一点,使标题行全部小写).
PS.另外,我很想知道为什么地狱栏目会将桌面名称的区分大小写开始起作用?
小智 24
您可以将header_converters选项与CSV一起使用:
CSV.foreach(file, :headers => true, :header_converters => lambda { |h| h.try(:downcase) }) do |row|
Users.create!(row.to_hash)
end
Run Code Online (Sandbox Code Playgroud)
将.try放在那里很重要,因为空标头会抛出异常.比在每一行上做得更好(也更快).
bor*_*r1s 16
你可以使用这样的东西:
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
Run Code Online (Sandbox Code Playgroud)
我没有时间测试它,但你可以理解它.
希望它会有所帮助
你可以简单地做
hash.transform_keys(&:downcase)
Run Code Online (Sandbox Code Playgroud)
将哈希键更改为小写,或者您也可以根据需要将哈希值转换为小写或大写。
hash.transform_values(&:downcase) 或者 hash.transform_values(&:upcase)
hash = {:A=>"b", :C=>"d", :E=>"f"}
hash.transform_keys(&:downcase)
=> {:a=>"b", :c=>"d", :e=>"f"}
Run Code Online (Sandbox Code Playgroud)
由于这是用Rails标记的。
随着ActiveSupport从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'
Run Code Online (Sandbox Code Playgroud)
ActiveSupport 4.0.2也对此进行了介绍:
my_hash.deep_transform_keys!(&:downcase)
# or if your hash isn't nested:
my_hash.transform_keys!(&:downcase)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13497 次 |
| 最近记录: |