Ruby简单的map对象无法正常工作

时间:2014-04-26 14:37:17

标签: ruby-on-rails ruby

我有一个简单的问题,但我找不到解决方案。 我有一个包含多个字段的论坛模型(活动记录)。

我正在创建一个类方法,它返回给我一个has,其中一个值作为键(不是id),另一个作为值。

这是我的方法:

Forum.all.map { |f| [f.old_id => f.icon.url(:micro) ]}

返回

[[{10=>"/images/fallback/icon_fallback.png"}],
 [{6=>"/images/fallback/icon_fallback.png"}],
 [{18=>"/images/fallback/icon_fallback.png"}]]

而不是

{10=>"/images/fallback/icon_fallback.png", 6=>"/images/fallback/icon_fallback.png", 18=>"/images/fallback/icon_fallback.png"}

错误是什么?

5 个答案:

答案 0 :(得分:1)

简而言之,您可以像这样修改,将square brackets更改为curly brackets

Forum.all.inject({}) { |r,f| r.merge!(f.old_id => f.icon.url(:micro)) }

答案 1 :(得分:1)

在你的代码中,map返回一个数组,方括号产生包含哈希的数组。

res = {}
Forum.all{|f| res[f.old_id] = f.icon.url(:micro) }

答案 2 :(得分:1)

您可以使用to_h

对代码进行微小更改并获得所需的结果
Forum.all.map { |f| [f.old_id,  f.icon.url(:micro)] }.to_h

答案 3 :(得分:0)

是的,您可以使用reduceinject方法,或只是从Hash构建Array

Hash[Forum.all.map { |f| [f.old_id, f.icon.url(:micro) ]}]

您可以使用#to_h方法:

Forum.all.map { |f| [f.old_id, f.icon.url(:micro) ]}.to_h

答案 4 :(得分:0)

使用有效支持each_with_object

Forum.all.each_with_object({}) { |f, h| h[f.old_id] = f.icon.url(:micro) }