2012-07-12 62 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 } 
相关问题