将字段数组转换为Hash,并将字段作为键

时间:2013-04-02 10:03:35

标签: ruby type-conversion

我有一个对象数组:

[
  #<User id: 1, name: "Kostas">,
  #<User id: 2, name: "Moufa">,
  ...
]

我希望将其转换为Hash,其中id为键,对象为值。现在我这样做,但我知道有更好的方法:

users = User.all.reduce({}) do |hash, user|
  hash[user.id] = user
  hash
end

预期产出:

{
  1 => #<User id: 1, name: "Kostas">,
  2 => #<User id: 2, name: "Moufa">,
  ...
}

2 个答案:

答案 0 :(得分:53)

users_by_id = User.all.map { |user| [user.id, user] }.to_h

如果您使用的是Rails,则ActiveSupport会提供Enumerable#index_by

users_by_id = User.all.index_by(&:id)

答案 1 :(得分:4)

使用each_with_object代替reduce,您可以获得更好的代码。

users = User.all.each_with_object({}) do |user, hash|
  hash[user.id] = user
end