Search code examples
rubytype-conversion

Convert Array of objects to Hash with a field as the key


I have an Array of objects:

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

And I want to convert this into an Hash with the id as the keys and the objects as the values. Right now I do it like so but I know there is a better way:

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

The expected output:

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

Solution

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

    If you are using Rails, ActiveSupport provides Enumerable#index_by:

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