2

重複の可能性:
2 つの配列をハッシュに結合する

I have an model which stores key value pairs as attributes for another model person.

What is a simple way of turning person.person_attributes into a hash?

This is a stupid way I came up with:

keys = person.person_attributes.map(&:key)
values = person.person_attributes.map(&:value)

hashed_attributes = Hash.new

keys.each_index do |i|
  hashes_attribues[keys[i]] = values[i]
end

What is a more elegant way to do this?

Thank you in advance,

4

2 に答える 2

4

こういうの好きEnumerable#each_with_objectです

attributes = person.person_attributes.each_with_object({}) do |attribute, hash|
  hash[attribute.key] = attribute.value
end

まだ Ruby 1.8.7 を使用している場合でも心配はいりません。Railsはこのメソッドをバックポートしています。

于 2012-10-04T22:13:22.810 に答える
2

keyそれぞれがandプロパティを持つオブジェクトの配列を、 が?にマップvalueされるハッシュに変換したいとします。keyvalue

以下を使用Hash[array]して、2 次元配列をハッシュに変換することができます。

Hash[person.person_attributes.map { |e| [e.key, e.value] }]

入力:

Obj = Struct.new(:key, :value)

[ { Obj.new(:key1, :value1) },
  { Obj.new(:key2, :value2) },
  { Obj.new(:key3, :value3) }
]

出力:

{ :key1 => :value1, :key2 => :value2, :key3 => :value3 }
于 2012-10-04T22:02:48.023 に答える