我的scoreboard
有很多games
。 game
has_many users
和user
has_many games
,因此我有一个联接表/模型game_users
。
Scoreboard
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
方法似乎不适用于实例。我怎样才能做到这一点?
答案 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
方法中。