从ruby中的数组中检索实例

时间:2015-12-07 13:08:15

标签: ruby-on-rails arrays ruby instance

我的scoreboard有很多gamesgame has_many usersuser has_many games,因此我有一个联接表/模型game_usersScoreboard belongs_to competition。我的管理员可以生成与竞赛相关联的记分板。 我们的想法是在该记分牌上生成记分牌和(@competition.users.count / 2)游戏(前提是我们拥有偶数玩家)。游戏是两个玩家之间的对抗。

在我的scoreboard_controller中,我有:

 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方法似乎不适用于实例。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

使用-=代替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

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