2012-07-12 63 views
2

我目前使用下面進入某一個領域的一個數組中的表:你如何使用map來獲得散列而不是數組?

Classrooms.all.map(&:teacher_name) 

這將返回以下:

["James", "Josh", "Peter"] 

我要的是一個哈希這樣反而有點像下面,我可以包括teacher_id:

{"James" => "1", "Josh" => "2", "Peter" => "3"} 

我使用Classrooms.all.map(&:teacher_name, &:teacher_id)嘗試,但它給了我一個語法錯誤。

謝謝!

回答

3

就做了老式的方法:

pairs = Classrooms.all.map {|t| 
    [t.teacher_name, t.teacher_id] # [key, value] 
} 
hash = Hash[pairs]    # in /old/ ruby: Hash[*pairs.flatten] 

..或者諸如此類的東西。

參見In Ruby, how do I make a hash from an array?

+0

我可以在一行中完成所有這一切嗎?謝謝! – Goalie 2012-07-12 04:45:17

+1

是的,你可以。只要將賦值給'pairs'並將其放在使用'pairs'的地方(不先指定它)即可。例如:'hash = Hash [Classrooms.all.map {| t | [t.teacher_name,t.teacher_id]}]'現在,你將來能夠理解/維護這個嗎?這是真正的目標:) – 2012-07-12 05:19:40

0

另一種方法是完全不使用的每個。改用each_with_object。它專爲您正在嘗試做的事情而設計。

Classrooms.all.each_with_object({}) { |c, hash| hash[c.teacher_name] = c.teacher_id } 
相關問題