我有一个scoreboard
,它有许多games
。game
有很多users
,user
有很多games
,所以我有一个联接表/模型game_users
。Scoreboard
属于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
方法中。