Перебор двух массивов и построение нового массива из соответствий - PullRequest
0 голосов
/ 15 апреля 2019

Хорошо, у меня есть массив «идентификаторов победителей», этот массив представляет пользователей, которые выиграли в предыдущем раунде турнира.Затем у меня есть массив объектов, называемых «участие в турнире», он представляет всех пользователей, которые участвовали в турнире (таблица присоединения ко многим отношениям).

Для каждого «идентификатора победителя» я хочу пройти по массиву «Участие в турнирах» и найти участие в турнире с идентификатором пользователя, совпадающим с «идентификатором победителя», а затем вставить его в новый массив под названием «Участие в раунде».'...

Я пробовал приведенный ниже код, но мне всегда возвращался исходный массив' winner_ids '....

@challenges = Challenge.where(tournament_id: @tournament.id)
@winner_ids = @challenges.pluck(:winner_id)
@tournament_participations = @tournament.tournament_participations
@round_participations = []
@round_participations = @winner_ids.each do |winner_id|
   @round_participation = @tournament_participations.where(user_id: winner_id)
   @round_participations << @round_participation
end

Ответы [ 2 ]

4 голосов
/ 15 апреля 2019

each возвращает перечисляемое значение, к которому он был вызван; в этом случае @winner_ids.each возвращает @winner.ids. Вам не нужно присваивать результат итерации @round_participations.

Также, проверьте метод map .

1 голос
/ 15 апреля 2019

Используйте метод карты вместо .each.

Метод map можно использовать для создания нового массива на основе исходного массива, но со значениями, измененными предоставленным блоком.См. Пример ниже.

В случае каждый метод

irb(main):001:0> arr = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]
irb(main):002:0> arr.each { |a| print a -= 10, " " }
-9 -8 -7 -6 -5 
=> [1, 2, 3, 4, 5]

, который вы можете увидеть после итераций, он вернул исходный массив.Но в случае map

irb(main):005:0> arr = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]
irb(main):006:0> arr.map { |a| 2*a }
=> [2, 4, 6, 8, 10]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...