2012-07-10 27 views
2

因此我非常抱歉,如果我没有正确地遵循指导方针,联盟应用程序的数据库结构

我正在设计一个Rails的在线联盟管理应用程序,并且在数据库设计中遇到了一些问题,我现在宁愿理清这些问题,而不是继续研究我所得到的结果,并发现它不会在以后工作。

目前,我有以下型号:

class League < ActiveRecord::Base 
    has_many :teams 
    has_many :players 
end 

class Team < ActiveRecord::Base 
    belongs_to :league 
    has_many :players 
end 

class Player < ActiveRecord::Base 
    belongs_to :league 
    belongs_to :team 
end 

的想法是,联盟既可以由玩家,或者只是个别球员的球队没有一支球队。我目前在联盟列表中有一个league_type属性,用于标识联盟是否适合球队或球员。我的第一个问题是这是否是处理这种情况的好方法?

这似乎可能是一个问题的原因之一是当我尝试创建一个匹配,因为它会由玩家或团队组成。我原本以为我会有一个带有home_id和away_id属性的Match模型,然后根据联盟类型使用player_ids或team_ids来填充这些模型,但是这对我来说并不是很好的设计。我曾考虑过将主场和客场做成多态,也许这是最好的方式?例如。

class Match < ActiveRecord::Base 
    belongs_to :home_matchable, polymoprhic: true 
    belongs_to :away_matchable, polymoprhic: true 
end 

,然后添加 “的has_many:home_matches,如:home_matchable” 和 “的has_many:away_matches,如:away_matchable” 对球队和球员。

我现在只是发现有限数量的视图和控制器,我似乎需要定期检查联盟是否适合球队或球员,所以有很多“如果league_type == '团队'在我的代码中做了其他事情做了别的事情“,这些代码感觉有点难看。特别是如果下了赛道,我决定增加一个“双打”类型,所以他们会变成“如果'队'然后其他如果'球员'然后其他”等。

对不起,这成了很多比我预想的更长,任何帮助都非常感谢!

回答

1

为什么不强迫玩家默认参加队伍? 在DB中创建一个球员时,您会自动为他创建一个团队,并让他成为唯一成员。

你也可以用布尔值来标记这些球队,告诉你这些球员不是多人团队。

这样,你只会在创建匹配时处理团队。我个人不喜欢多态的方法,在访问你的关联时操纵不同的模型会变得很棘手。

+0

这就是我最终这样做的结果。我给了联盟模型一个参与者类型属性,它标识联盟是否适合球员或球队。似乎运作良好。谢谢。 – mchapman17 2012-08-08 09:26:42