联盟应用的数据库结构

时间:2012-07-10 00:10:43

标签: ruby-on-rails database associations structure

关于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 ==”团队'做其他事做别的事“我的代码中的陈述感觉有点难看。特别是如果在赛道上我决定要添加一个“双打”类型,那么他们会变成“如果'球队',那么如果'球员'那么就是其他人”等等。

对不起,这比我预期的要长很多,非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

为什么不默认强制玩家加入团队? 在DB中创建玩家时,您将自动为他创建一个团队并使他成为唯一的成员。

您还可以使用布尔值标记这些团队,告诉您这些团队不是多人团队。

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