2009-12-02 11 views
5

Od modelu, który zwraca wszystkie wartości z tabeli, jak chciałbym przekonwertować do mieszania z par wartości nazwaArray hash par wartości klucza w Ruby

{column_value => column_value} 

przykład

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

do (określające: id i: nazwa)

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

Zastanawiam się, czy można to zrobić w jednej linii ... – Christopher

+0

@ Christopher: Tak, można to zrobić za pomocą jednego liniowca. Zaktualizowałem swoją odpowiedź rozwiązaniem alternatywnym z jednym linkiem. –

+0

Jesteś pewny; zobacz moją odpowiedź używając 'inject '. –

Odpowiedz

5

Poniższa metoda jest dość zwarty, a jednocześnie czytelny:

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

Zastosowanie:

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

Albo, jeśli chcesz jedną wkładkę:

>> 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

Można to zrobić w jednej linii z 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} 
Powiązane problemy