2017-04-16 2 views
0

Je travaille sur un système de traduction et j'ai besoin de construire une "carte" de traduction des champs à traduire. Pour commencer, j'ai besoin de construire la structure de données avec un ensemble de paramètres par défaut.Comment créer un hachage à double imbrication dans Ruby?

Disons que j'ai ces variables:

fields = [:title, :description] 
languages = [:en, :fr] 

J'essaie de trouver la façon la plus simple de créer un hachage qui ressemble à ceci:

{ 
    :detection => { 
    :title => { 
     :en => :en, 
     :fr => :fr 
    }, 
    :description => { 
     :en => :en, 
     :fr => :fr 
    } 
    }, 
    # ... other fields 
} 

Je sais que je peux faire ceci en itérant sur la variable fields et, à l'intérieur de celle-ci, construisez les valeurs de hachage internes en utilisant la méthode zip de Ruby. Ce que je ne sais pas, cependant, c'est s'il y a un moyen de "doubler" les valeurs externes et internes de ces deux champs. Quelque chose comme { :detection => fields.zip(languages.zip(languages)) } (je sais que ce n'est pas la bonne façon d'utiliser zip mais c'est l'idée que je suis après).

Encore une fois, je peux le faire avec une boucle sur fields mais je suis curieux de savoir si je peux le faire différemment?

Merci!


Voilà comment il est actuellement mis en œuvre (mise en boucle):

def build_default_detection_data 
    fields = [:title, :description] 
    languages = [:en, :fr] 

    default = { 
    detection_map: {}, 
    } 

    fields.each do |field| 
    default[:detection_map][field] = Hash[languages.zip(languages)] 
    end 

    default 
end 

Répondre

0

Je ne suis pas sûr que je comprends la question, mais est ici une réponse à mon interprétation.

keys  = [:detection, :abstraction] 
fields = [:title, :description] 
languages = [:en, :fr] 

keys.each_with_object({}) do |key, g| 
    g.update(
    key => fields.each_with_object({}) do |f, h| 
     h[f] = languages.each_with_object({}) { |sym, h| h[sym] = sym } 
    end 
) 
end 

#=> { 
#  :detection => { 
#  :title => { 
#   :en => :en, 
#   :fr => :fr 
#  }, 
#  :description => { 
#   :en => :en, 
#   :fr => :fr 
#  } 
#  }, 
#  :abstraction => { 
#  :title => { 
#   :en => :en, 
#   :fr => :fr 
#  }, 
#  :description => { 
#   :en => :en, 
#   :fr => :fr 
#  } 
#  } 
# } 
+0

Merci, @Alex. Beaucoup mieux. –