2009-12-02 3 views
5

partir d'un modèle qui renvoie toutes les valeurs d'une table, comment je convertir en un hachage de paires de valeurs de nommatrice de hachage de paires de valeurs clés dans le rubis

{column_value => column_value} 

par exemple

[{:id => 1, :name => 'first'}, {:id => 2, :name => 'second'}, {:id => 3, :name => 'third'}] 

à (en précisant: id et: nom)

{'first' => 1, 'second' => 2, 'third' => 3} 
+0

Je me demande si cela pourrait se faire en une ligne ... – Christopher

+0

@ Christopher: Oui, cela peut aussi être fait avec un one-liner. J'ai mis à jour ma réponse avec une solution à une ligne comme alternative. –

+0

Vous pouvez bien sûr; voir ma réponse en utilisant 'injecter'. –

Répondre

5

L'approche suivante est assez compact, mais toujours lisible:

def join_rows(rows, key_column, value_column) 
    result = {} 
    rows.each { |row| result[row[key_column]] = row[value_column] } 
    result 
end 

Utilisation:

>> rows = [{:id => 1, :name => 'first'}, {:id => 2, :name => 'second'}, {:id => 3, :name => 'third'}] 
>> join_rows(rows, :name, :id) 
=> {"third"=>3, "second"=>2, "first"=>1} 

Ou, si vous voulez en une ligne:

>> rows.inject({}) { |result, row| result.update(row[:name] => row[:id]) } 
=> {"third"=>3, "second"=>2, "first"=>1} 
0
o = Hash.new 
a = [{:id => 1, :name => 'first'}, {:id => 2, :name => 'second'}, {:id => 3, :name => 'third'}] 
a.each {|h| o[h[:name]] = h[:id] } 

puts o #{'third' => 3, 'second' => 2, 'first' => 1} 
6

Vous pouvez le faire en une ligne avec inject:

a = [{:id => 1, :name => 'first'}, {:id => 2, :name => 'second'}, {:id => 3, :name => 'third'}] 
a.inject({}) { |sum, h| sum.merge({ h[:name] => h[:id]}) } 
# => {"third" => 3, "second" => 2, "first" => 1} 
Questions connexes