将键/值对转换为哈希值

时间:2012-10-04 21:58:57

标签: ruby-on-rails ruby ruby-on-rails-3

  

可能重复:
  Combine two Arrays into Hash

我有一个模型,它将键值对存储为另一个模型人的属性。

将person.person_attributes转换为哈希的简单方法是什么?

这是我提出的一种愚蠢的方式:

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

这是一种更优雅的方法吗?

提前谢谢你,

2 个答案:

答案 0 :(得分: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 has backported this method

答案 1 :(得分:1)

您希望将每个具有keyvalue属性的对象数组转换为散列,其中key映射到value

您可以使用以下内容,使用Hash[array]将二维数组转换为哈希:

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 }