Как я могу сделать что-то подобное с массивами ruby

#ruby-on-rails #ruby #ruby-on-rails-3 #ruby-on-rails-4

#ruby-on-rails #ruby #ruby-on-rails-3 #ruby-on-rails-4

Вопрос:

У меня есть пользовательский массив, подобный этому:

 users_array = [[1,text for 1],[2,text for 2],[3,text for 3],[4,text for 4],[5,text for 5]]
  

здесь первым элементом является user_id, а вторым элементом является текст, специфичный для user_id в том же массиве.

Теперь я пытаюсь использовать пользовательский объект из вместо идентификаторов в массиве, подобном этим.

 users_array = [[#<User id: 1, encrypted_email: "">,text for 1],[#<User id: 2, encrypted_email: "">,text for 2],[#<User id: 3, encrypted_email: "">,text for 3],[#<User id: 4, encrypted_email: "">,text for 4],[#<User id: 5, encrypted_email: "">,text for 5]]
  

Я стараюсь не перебирать массив и не обращаться к БД тысячу раз для тысяч пользователей.

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

1. Как вы получите объект user для заданного идентификатора, не запрашивая базу данных?

2. Используйте includes , если текст связан с User

3. Попробуйте использовать правильный код Ruby в своих примерах, например, использовать "text for 1" вместо text for 1 .

Ответ №1:

 data = users_array.to_h
# find all users with single query and build your map
User.where(id: data.keys).map { |user| [user, data[user.id]] }
  

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

1. users_array = Hash[users_array]

2. users_array.to_h также будет работать, но присвоение хэша переменной с именем users_array выглядит немного грязно.

Ответ №2:

Вы могли бы использовать transpose для извлечения идентификаторов и значений, а zip также для объединения пользователей и значений:

 ids, values = users_array.transpose
users_array = User.find(ids).zip(values)