将散列键转换为小写 - Ruby Beginner

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)

我没有时间测试它,但你可以理解它.
希望它会有所帮助

  • 为什么不呢?您的数据库(可能)区分大小写,Rails只传递名称. (2认同)

Tou*_*aza 8

你可以简单地做

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)


neo*_*rau 5

由于这是用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)

  • `with_indifferent_access`支持字符串或符号,但对我而言*不区分大小写*。ActiveSupport 5.0.4。 (4认同)