2013-01-23 2 views
1

Je souhaite créer un hachage à partir d'un tableau de lignes à partir d'une base de données. Je peux facilement le faire avec le code ci-dessous. Je suis venu à Ruby de PHP et voici comment je le ferais. Existe-t-il une meilleure façon de faire cela dans Ruby (ou Rails)?Une meilleure façon de créer un hachis rubis?

def features_hash 
    features_hash = {} 
    product_features.each do |feature| 
    features_hash[feature.feature_id] = feature.value 
    end 

    features_hash 
end 

# {1 => 'Blue', 2 => 'Medium', 3 => 'Metal'} 

Répondre

5

Vous pouvez utiliser Hash[]:

Hash[ product_features.map{|f| [f.feature_id, f.value]} ] 

Est-ce que vous aimez ce mieux?

product_features.map{|f| [f.feature_id, f.value]}.to_h # no available (yet?) 

Ensuite, allez check-out disponible this feature request et de commentaires là-dessus!

solutions alternatives:

product_features.each_with_object({}){|f, h| h[f.feature_id] = f.value} 

Il y a aussi group_by et index_by qui pourrait être utile, mais les valeurs sont les caractéristiques elles-mêmes, pas leur value.

+0

Sweet! Merci mec! RubyMine n'aime pas cette syntaxe mais ça marche bien! Et oui, cette méthode semble pratique! –

1

Votre code est un bon moyen de le faire. Une autre façon est:

def features_hash 
    product_features.inject({}) do |features_hash, feature| 
    features_hash[feature.feature_id] = feature.value 
    features_hash 
    end 
end 
+0

Ah juste merci! Je ne suis pas sûr d'aimer cette façon si .. –

3

Vous pouvez utiliser index_by pour cela:

product_features.index_by(&:id) 

Ce produit les mêmes résultats que la main la construction d'un hachage avec id comme la clé et les enregistrements que les valeurs.

+0

(J'aime cette solution la meilleure, même si ce n'est pas ce qui est demandé.) –

+0

J'ai mal lu la question concernant le mapping à 'value'. C'est un moyen générique pratique pour obtenir des choses au format hash. Je vais voir si je peux trouver un raccourci pour extraire une seule valeur en utilisant ceci. –

+0

J'aime vraiment cette approche, et je pourrais vraiment l'utiliser telle quelle, merci! –

Questions connexes