Подтвердить что ты не робот

Преобразование массива объектов в Hash с полем в качестве ключа

У меня есть массив объектов:

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

И я хочу преобразовать это в хэш с 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">,
  ...
}
4b9b3361

Ответ 1

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

Вопрос не помечен , но ваш код выглядит так. Проверить ActiveSupport Перечислить # index_by:

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

Ответ 2

Вы получите немного лучший код, используя each_with_object вместо reduce.

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