1

次の点を考慮してください。

details = Hash.new

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

2 つのチームの名前を取得する方法は次のとおりです。

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

ここで、チームの名前を team1 と team2 の下のハッシュに保存したいと思います。配列を使用していた場合、次のことができます。

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 に答える