11
votes

Convertir des clés hachées en minuscule - Ruby Débutant

Mes noms de champs de table sont minuscules et les noms de champs que je reçois des fichiers CSV sont Camelcase. Est là quand même je peux convertir les clés d'un tableau de hachage à minuscule?

Voici le code que j'ai maintenant: xxx

Ceci échoue car les touches sont Cas de chameau (j'ai vérifié cela en édité manuellement le fichier pour rendre la ligne d'en-tête tous minuscules).

ps. Aussi, j'aimerais savoir pourquoi les rails d'enfer prennent des noms de champs de table en jouant au jeu?


0 commentaires

9 Réponses :


16
votes

Vous pouvez utiliser quelque chose comme ceci:

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


4 commentaires

Ça marche! Mais je suis aussi curieux de savoir pourquoi les rails de Heck appliqueraient ici (mon système de fichiers n'est pas sensible à la casse, ce qui n'est pas le problème).


Excusez-moi, mais je ne comprends pas ce que vous voulez dire dire: Les rails emmènent des noms de champs de table, la sensibilité de l'affaire en jeu pour commencer? :) (Peut-être que c'est ma mauvaise connaissance anglaise :))


Cela signifie pourquoi les rails nécessitent-ils des noms de champs dans le tableau pour correspondre aux clés du hachage lors de l'insertion


Pourquoi n'est-ce pas? Votre dB est (probablement) sensible à la casse et les rails passent simplement les noms.



1
votes

J'ajouterais le hasch directement, plus efficace que fusionner! Parce que vous ne créez pas de nouveau hash pour chaque paire. xxx


0 commentaires

4
votes

Ruby 1.9 fournit un moyen assez agréable d'y parvenir, en utilisant chaque_with_object pour éviter l'initialisation d'une variable temporaire.

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


0 commentaires

25
votes

Vous pouvez simplement utiliser l'option Header_Converters avec CSV:

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


0 commentaires

1
votes

J'ai trouvé que cette solution est significativement plus rapide et un peu plus "rubish". xxx


1 commentaires

Je ne sais pas qu'il est plus rubish - il utilise une méthode de classe ou de module qui utilise même une méthode se terminant!



2
votes

Je trouve cette approche plus élégante: xxx


1 commentaires

to_a.map {| clé, valeur | [key.uppcase.to_s, valeur]} .to_h a l'air propre pour moi.



6
votes

Étant donné que cela a été étiqueté avec des rails.

avec ActiveSupport Démarrage VOM version 3.0 Vous pouvez utiliser un hashwithindiferenaccess .

qui permettra d'accéder à la baisse / en majuscule / en majuscule. Les clés ou votre hachage. xxx

activeupport 4.0.2 a également introduit ceci: xxx


2 commentaires

with_indifferent_access prend en charge la chaîne-ou-symbole, mais est pas insensible à la casse pour moi. ActiveSupport 5.0.4.


Comme Justin Maxwell ici. J'ai utilisé une alternative à la place.



8
votes

Vous pouvez simplement faire

hash = {:A=>"b", :C=>"d", :E=>"f"}
hash.transform_keys(&:downcase)
=> {:a=>"b", :c=>"d", :e=>"f"}


0 commentaires

1
votes

Vous pouvez envisager d'utiliser Underscore au lieu de downcase car cela transformerait également le camelcase sur CAMEL_CASE NOTATION, qui est plus rubylike.

Mes préférences personnelles vont à l'aide de Deep_Transform_Keys : hash.deep_transform_keys {| clé | clé.underscore.to_sym}

comme transform_keys Ne traversez pas l'ensemble du hachage.


0 commentaires