关于SO的第一篇文章所以如果我没有正确遵守指南,我会道歉。
我正在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,as:home_matchable”和“has_many:away_matches,as:away_matchable”添加到团队和玩家。
我发现目前我拥有的观看次数和控制器数量有限,我似乎需要定期检查联赛是否适用于球队或球员,所以有很多“if league_type ==”团队'做其他事做别的事“我的代码中的陈述感觉有点难看。特别是如果在赛道上我决定要添加一个“双打”类型,那么他们会变成“如果'球队',那么如果'球员'那么就是其他人”等等。
对不起,这比我预期的要长很多,非常感谢任何帮助!
答案 0 :(得分:1)
为什么不默认强制玩家加入团队? 在DB中创建玩家时,您将自动为他创建一个团队并使他成为唯一的成员。
您还可以使用布尔值标记这些团队,告诉您这些团队不是多人团队。
这样,您只需在创建匹配时与团队打交道。我个人不喜欢多态方法,在访问你的关联时操纵不同的模型会变得很棘手。