0

我目前正在为体育俱乐部开发一个应用程序,它允许俱乐部管理员管理部门、团队,并最终管理球员。

目前我的数据库/关系如下

class Sport < ActiveRecord::Base
  has_many  :clubs
  has_many :teams
  attr_accessible :club_id


class Club < ActiveRecord::Base
  belongs_to :sport
  has_many  :teams
  has_many :users
  has_many  :divisions
  attr_accessible :sport_id

class Division < ActiveRecord::Base
  has_many :teams
  belongs_to  :club
  attr_accessible :club_id

class Team < ActiveRecord::Base
  has_many  :users
  has_many  :schedules
  belongs_to :division
  belongs_to :club
  attr_accessible :division_id, :club_id

class User < ActiveRecord::Base
  belongs_to :club
  belongs_to :team
  attr_accessiable :club_id, :sport_id

我想要的是一种更简洁的管理方式。IE

  • 用户只能属于 1 个俱乐部,在 1 个分区内,但可以有多个团队
  • 球队只能属于 1 个分区、1 个俱乐部、1 个运动,但有多个用户
  • 分区只能属于 1 个俱乐部,在 1 个运动中,但有多个团队
  • 俱乐部只能属于一项运动,但有多个团队和多个部门

目前上述工作正常,但我不认为关系/结构处于最佳状态

4

2 回答 2

1

你的国家只有单一的体育俱乐部吗?在德国,俱乐部的不同部门可以有不同的运动(我自己的俱乐部,例如田径、自行车、排球、篮球、乒乓球和游泳)。在我的大多数应用程序中,我只是跳过了运动和分区:运动是从应用程序的上下文中给出的,我认为俱乐部和分区是相同的。我的运动应用程序只处理俱乐部,而不是俱乐部的部门。我认为这种牺牲是必要的,否则复杂性会让我不知所措——当然,你的里程可能会有所不同:-)

而且:一个用户只是暂时属于一个俱乐部,所以我在用户和球队之间有一个中间关系;德语中的“Startberechtigung”,类似于英语中的“license”,我会说;它属于团队和属于用户,并具有“start_date”和“stop_date”作为附加属性。这样我什至有俱乐部和用户的历史。对记录列表很重要(再次:田径)!

之后我会丢弃多余的传递关系:用户属于一个团队,而该团队又属于俱乐部 => 使用 has_many :through's more; 您不需要用户 belongs_to 俱乐部。

现在你的模型应该更干净了。

更新

不要为玩家使用类名“User”,这最终会导致与您的用户/管理员模型发生冲突。“球员”或“运动员”对我来说很好。

更新 2

当然,您不需要在每种情况下都使用 :through 。尤其是,带有包含或类方法的范围可能更适合您。如果你想跨越一个以上的中级。

怎么样(请填写推荐指南中的漏洞):

class Sport < ActiveRecord::Base

has_many :clubs
has_many :teams, :through => :clubs, :readonly => false


class Club < ActiveRecord::Base

belongs_to :sport
has_many :teams


class Team < ActiveRecord::Base

belongs_to :club

has_many :athlete_teams
has_many :athletes, :through => :athlete_teams, :readonly => false


class AthleteTeam < ActiveRecord::Base

belongs_to :teams
belongs_to :athletes


class Athlet < ActiveRecord::Base

has_many :athlete_teams
has_many :athletes, :through :athlete_teams, :readonly => false
于 2012-09-12T08:47:10.163 回答
0

有关 ActiveRecord 关联的帮助可以在http://api.rubyonrails.org上找到

希望这会对您有所帮助。

于 2012-09-12T08:07:45.800 回答