Сокращенный способ взять массив моделей Ruby и превратить его в хэш с идентификатором в качестве ключа?

#ruby

#ruby

Вопрос:

У меня есть массив моделей, которые я хотел бы превратить в хэш, чтобы я мог ссылаться на них по идентификатору. Я знаю, что могу перебирать элементы и помещать их в хэш, но я знаю, что должен быть быстрый, сокращенный способ сделать то же самое:

 my_models_hash = {}
@my_models.each do |model|
  my_models_hash[model.id] = model
end
 

Как я могу сделать то же самое в одной короткой строке?

Комментарии:

1. Если вы используете Rails / ActiveSupport, есть @my_models.index_by(amp;:id)

2. @Stefan Пожалуйста, превратите это в ответ. Это отличный вариант, и я бы хотел проголосовать за него!

Ответ №1:

Вам нужно each_with_object .

 my_models_hash = @my_models.each_with_object({}) { |m,h| h[m.id] = m }
 

Ответ №2:

Один из способов:

 @my_models.map { |m| [m.id, m] }.to_h
 

До версии 2.0 это должно было быть записано:

 Hash[@my_models.map { |m| [m.id, m] }]
 

Комментарии:

1. Правда, только в современных rubies.

2. @Sergio, мое эмпирическое правило заключается в том, что мне не нужно указывать версию, когда Ruby получил функцию, если она была 1.9 или более ранней. Я думал to_h , что был добавлен в 1.9, но нет, это был 2.0. Спасибо.

3. Если специально не указана версия, по умолчанию следует использовать последнюю версию.

Ответ №3:

Если вы используете Rails (или, более конкретно, ActiveSupport), есть Enumerable#index_by :

 @my_models.index_by(amp;:id)
#=> { 1 => #<Model id: 1, ...>, 2 => #<Model id: 2, ...>, ...}