#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, ...>, ...}