好的,所以我有一个“获奖者ID”数组,该数组代表在上一轮比赛中获胜的用户。然后,我有一个称为“锦标赛参与”的对象数组,该对象表示已参加锦标赛的所有用户(多对多关系联接表)。
对于每个“获胜者ID”,我要遍历“锦标赛参与”数组,并使用与“获胜者ID”匹配的user_id查找比赛参与,然后将其推入名为“全面参与”的新数组中。
我尝试了下面的代码,但总是得到原始的'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
答案 0 :(得分:4)
each
返回被调用的可枚举值;在这种情况下,@winner_ids.each
返回@winner.ids
。您无需将迭代结果分配给@round_participations
。
还要检查the map
method。
答案 1 :(得分:1)
使用map方法而不是.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]
您可以看到迭代后它返回了原始数组。但是对于地图
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]
地图可以转换数组的内容,这意味着它可以对数组中的每个元素执行操作。