2011-11-04 24 views
1

我试图将玩家分配到一个俱乐部。 一个俱乐部有n个球员,一个球员属于一个俱乐部。 俱乐部只能有少于23名球员,并且不超过2名球员在同一位置上进行比赛。使用数据映射器的对象关联

clubs = Club.all #Club is a datamapper object. Returns 20 clubs 
to_generate = 10000 
while (to_generate > 0) 
    p = Player.new #Player is a datamapper object 
    p.position = position #position is a random integer defined elsewhere 

    clubs.each do |club| 
    count = 0 
    club.players.each do |club_player| 
     if (club_player.position == p.position) 
     count += 1 
     end 
    end 
    if (count < 2 && club.players.length < 22) 
     club.players << p 
     p.club = club 
    end 
    end 
    p.save 
    to_generate -= 1 

在脚本的结尾,我希望所有的俱乐部有22名球员。为什么不是这样?

编辑:在脚本结束时,我只得到22名队员分配到最后一家具乐(20)和10000个的球员产生

+0

每个俱乐部在脚本结尾处有多少球员? – Larsenal

+0

我编辑了这个问题。剧本结束时,我只得到22名玩家分配到最后一个俱乐部(20人)和10000名玩家生成 – marcosdsanchez

+0

我认为我已经为你解答了一个很好的答案。 – Larsenal

回答

0

问题1:您可以超过每队每

位置最高的球员

这些线

if (count < 3 && club.players.length < 23) 
    club.players << p 
    p.club = club 
end 

可以概括为“你可以将播放器添加到俱乐部,如果俱乐部有少于23名球员,并在该位置有少于3级的球员了。”

这意味着它可以让你再添加一个......总共有3个位置和23个团队。所以这部分逻辑是错误的。相反,你要

if (count < 2 && club.players.length < 22) 

问题2:随机数并不能保证你有合适类型的球员

如果是随机生成的位置,你不能确定,你将有足够的正确类型的玩家。例如,如果随机数始终是2,那该怎么办?你永远不会结束一个完整的团队。

问题3:一旦玩家被分配,你不断尝试其他俱乐部

一旦你分配一个球员,你不应该看任何更多的俱乐部。要做到这一点,你需要跳出each区块。

if (count < 3 && club.players.length < 23) 
    club.players << p 
    p.club = club 
    break 
end 

即使你叫club.players << p一堆次相同的球员,DataMapper的是了解你的一个一对一的关联,最后分配的“胜利”。

+0

问题1:好!问题2:我产生了10000名玩家,没有简单的方法可能发生。 – marcosdsanchez

+0

谢谢。解决方案3工作。 – marcosdsanchez

+0

关于问题2,确实不太可能。但确定性行为更好。因此,不要只是在这个问题上抛出10,000次迭代,你可以让你的while循环控制每个团队是否有其所需的22名球员。 – Larsenal