正在从ruby中的数组中检索实例



我有一个scoreboard,它有许多gamesgame有很多usersuser有很多games,所以我有一个联接表/模型game_usersScoreboard属于competition。我的管理员可以生成一个与比赛相关的记分牌。这个想法是生成记分牌和记分牌上的(@competition.users.count / 2)游戏(前提是我们有偶数个玩家)。游戏是两个玩家之间的对抗。

在我的记分板_控制器中,我有:

 def create
    @scoreboard = Scoreboard.new
    @scoreboard.competition = @competition
    authorize @scoreboard
    if @scoreboard.save
      if @competition.users && @competition.users.count.even?
        @total_players = @competition.users
        num = 0
        for num in 0..(@competition.users.count / 2) do
          game = Game.new(scoreboard: @scoreboard)
          game.save
          gameUserFirst = GameUser.new(game: game, user: @total_players.sample)
          @total_players = @total_players.except(gameUserFirst.user)
          gameUserSecond = GameUser.new(game: game, user: @total_players.sample)
          @total_players = @total_players.except(gameUserSecond.user)
          gameUserFirst.save
          gameUserSecond.save
          num += 1
        end
      end
      redirect_to  competition_scoreboard_path(@competition, @scoreboard)
    else
    end
  end

我的目标是在随机玩家之间生成游戏,但我不希望一个玩家被选中两次或与自己对抗。为了防止这种情况,一旦它在GameUser对象中使用,我就想从@total_players数组中检索它。不幸的是,.except方法似乎不适用于实例。我怎样才能做到这一点?

使用-=而不是except:

@total_players -= [gameUserFirst.user]

但我建议另一种创建匹配的方法:你可以制作一个所有用户id的数组,对其进行洗牌,然后选择组合:

@competition.user_ids.shuffle.in_groups_of(2).each do |user_id_1, user_id_2|
  # Create game...
end

另一点:在控制器中有那么多业务逻辑通常不是一件好事。可以放置在Scoreboard模型中的after_create方法中。

最新更新