1

考虑以下:

details = Hash.new

# Example of this Hash's final look
details["team1"] = "Example"
details["team2"] = "Another team"
details["foo"]   = "Bar"

我得到两支球队名字的方法是:

teams = Match.find(1).teams
=> [#<Team id: 1, name: "England">, #<Team id: 2, name: "Australia">]

现在我想将团队的名称保存到 team1 和 team2 下的 Hash 中。如果我使用数组,我可以这样做:

teams.each do |team|
  details << team.name
end

但是,我需要使用上面显示的哈希来执行此操作。一个人将如何实现这一目标?

4

4 回答 4

4
Hash[teams.map { |x| ["team_#{x.id}", x.name] }]
# => {"team_1"=>"England", "team_2"=>"Australia"}

如果你想保留 id 1 和 2

Hash[a.map.with_index { |x,i| ["team_#{i.succ}", x.name] }]
# => {"team_1"=>"England", "team_2"=>"Australia"}
于 2012-08-08T11:01:38.800 回答
2

那这个呢?

teams.each_with_index do |team, idx|
  id = "team#{idx + 1}"
  details[id] = team.name
end

在这里,您取出团队对象并从中取出哈希键,然后使用该键设置值。

于 2012-08-08T10:37:09.227 回答
1

为一个衬里使用注射剂怎么样?

teams.inject({}){ |details, team| details["team#{team.id}"] = team.name; details }

返回值将是一个数组或哈希。

于 2012-08-08T10:55:26.650 回答
0
{}.tap do |h|
  Match.find(1).teams.each_with_index {|t, i| h["team#{i+1}"] = t.name}
end
于 2012-08-08T10:49:57.517 回答