Convertion string->hash->data

Bonjour,

Je m’adresse aux experts, car je me demande si il n’y a pas une manière
plus elegante de resoudre mon problème. En effet, je veut convertir une
chaine de la forme:
“elem1:value1!elem2:value2!elem3:value3”

pour les mettre dans un ActiveRecord, avec bien entendu des champs
elem1,elem2,elem3

Difficultée, on peut avoir: elem1:!

c’est a dire elem1 n’est pas defini, ou vide…
Approche bourrine:

            hash_addr=Hash.new
            value.split('!').each do|elem|
                 res=elem.split(':')

                 if res.size > 2
                   hash_addr[res[0]]=res[1]
                 end
             end

             # La, j'ai un tableu de hash, que j'utilise comme ca
             # en creation:
             @place=Place.new(hash_addr)

             # ou comme ca, en update
             @place.attributes=hash_addr

Y a pas plus simple?

On 7/20/06, Thomas L. [email protected] wrote:

Difficultée, on peut avoir: elem1:!
A mon avis un expression régulière donnera déja plus de souplesse vis Ã
vis
des cas tordu

value.split(//)

(de tête avec la chaleur je sais pas exactement laquelle :wink:

Bonjour,

Je pense que ta solution est bonne.

Si tu veux un peu d’élégance tu peux peut-être créer une method
to_hash pour les Strings. Ni rails ni ruby n’ont une telle fonction :
(dans environment.rb)

class String
def to_hash(seperation=’!’, assignment=’:’)
hash = Hash.new
self.split(seperation).each do |elemement|
pieces = elemement.split(assignment)
hash[pieces[0]] = pieces[1]
end
hash.delete_if { |key, value| value.nil? }
end
end

Après tu pourras faire :
“elem1:value1!elem2:value2!elem3:value3”.to_hash

Ou encore si tu en as besoin… (peut-être pas mais bon) :
“elem1/value1|elem2/value2|elem3/value3”.to_hash(’|’, ‘/’)

Tu peux mettre le delete_if sous condition dans la définition de ta
méthode si tu n’a pas toujours besoin de supprimer les couples clef/
valeur ayant une valeur nulle.

Peut-être d’autres connaîtrons une meilleure solution mais la tienne
ne paraît pas si mal :slight_smile:

NP

Le 20 juil. 06 à 14:43, Thomas L. a écrit :

Salut Thomas,

c’est a dire elem1 n’est pas defini, ou vide…
Approche bourrine: (…)

Je ne trouve pas ton approche si bourrine, je te propose ça :

hash = {}
str.split(’!’).each do |e|
key, value = e.split(’:’, 2)
hash[key] = value.blank? ? nil : value
end

Si utiliser #inject est un signe d’élégance, alors tu peux écrire
ça :

hash = str.split(’!’).inject({}) do |acc, e|
key, value = e.split(’:’, 2)
acc[key] = value.blank? ? nil : value
acc
end

à tester avec :
str =
‘elem1:value1!elem2:value2!elem3:value3!elem4:!elem5!un:deux:trois’

– Jean-François.