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: p> 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). P> ps. Aussi, j'aimerais savoir pourquoi les rails d'enfer prennent des noms de champs de table en jouant au jeu? P> P>
9 Réponses :
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
Ç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.
J'ajouterais le hasch directement, plus efficace que fusionner! Parce que vous ne créez pas de nouveau hash pour chaque paire.
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
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
J'ai trouvé que cette solution est significativement plus rapide et un peu plus "rubish".
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!
Je trouve cette approche plus élégante:
to_a.map {| clé, valeur | [key.uppcase.to_s, valeur]} .to_h code> a l'air propre pour moi.
Étant donné que cela a été étiqueté avec des rails.
avec ActiveSupport Démarrage VOM version 3.0 Vous pouvez utiliser un qui permettra d'accéder à la baisse / en majuscule / en majuscule. Les clés ou votre hachage. p> activeupport 4.0.2 a également introduit ceci: p> hashwithindiferenaccess code>. p>
with_indifferent_access code> prend en charge la chaîne-ou-symbole, mais est pas insensible à la casse i> pour moi. ActiveSupport 5.0.4.
Comme Justin Maxwell ici. J'ai utilisé une alternative à la place.
Vous pouvez simplement faire
hash = {:A=>"b", :C=>"d", :E=>"f"}
hash.transform_keys(&:downcase)
=> {:a=>"b", :c=>"d", :e=>"f"}
Vous pouvez envisager d'utiliser Mes préférences personnelles vont à l'aide de comme Underscore code> au lieu de downcase code> car cela transformerait également le camelcase code> sur CAMEL_CASE CODE> NOTATION, qui est plus rubylike. p>
Deep_Transform_Keys Code>: Strong> hash.deep_transform_keys {| clé | clé.underscore.to_sym} code> p>
transform_keys code> Ne traversez pas l'ensemble du hachage. em> p>