我有一个简单的问题,但我找不到解决方案。 我有一个包含多个字段的论坛模型(活动记录)。
我正在创建一个类方法,它返回给我一个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"}
错误是什么?
答案 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)
是的,您可以使用reduce
或inject
方法,或只是从Hash
构建Array
:
Hash[Forum.all.map { |f| [f.old_id, f.icon.url(:micro) ]}]
ruby-2.0您可以使用#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) }