如何在俱乐部和团队中组织Rails模型的季节?

时间:2014-02-02 06:11:11

标签: ruby-on-rails database-design model

我有以下情况:

我有一个可以拥有多个团队的俱乐部,一个团队可以有几个玩家。

但是,团队所拥有的玩家每年都会有所不同。我想知道如何以某种方式将季节信息放入图片中,用户每个赛季都可以添加/删除玩家,并且能够看到前一赛季球队的球员。

因此,给出以下模型:

Club has_many Team
Team belongs_to Club
Team has_many Players

我如何才能让球队拥有很多球员依赖赛季(2013/2014 - 2012/2013 ..)

2 个答案:

答案 0 :(得分:4)

有两种方法可以做到:

一种是为SEASON创建另一种关系并创建三元关系(http://www.databasedesign.co.uk/bookdatabasesafirstcourse/chap3/chap3.htm

Ternary relationship

表格看起来像这样:

    PLAYER(id,...)
    TEAM(id,name,...,club_id)
    SEASON(id,season_name,...)
    SEASON_PARTICIPATION(id,player_id,season_id,team_id)

ActiveRecord关联将是:

    class Club < ActiveRecord::Base
      has_many :teams
    end

    class Team < ActiveRecord::Base
      belongs_to :club
      has_many :players, through: :season_participations
    end

    class Player < ActiveRecord::Base
      belongs_to :teams, through: :season_participations
    end

    class Season < ActiveRecord::Base
      has_many :players, through: :season_participations
    end

    class SeasonParticipation < ActiveRecord::Base
      belongs_to :player
      belongs_to :team
      belongs_to :season
    end

有关ActiveRecord关联的更多文档,请访问:http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

另一种方法是同时跳过SEASON关系并将其作为SEASON_PARTICIPATION关系中的简单属性。因此,season_id代替SEASON_PARTICIPATION您将获得季节的名称(参见图2)。拥有单独的SEASON关系可让您有机会存储有关季节的更多信息,例如开始日期/结束日期等。最后,您还可以在其他关系中添加部门信息。

No ternary relation

答案 1 :(得分:0)

有很多方法可以做到这一点。这是一些让人想起的东西。

  1. 将季节列添加到播放器模型。通过回调创建播放器的季节属性。如果季节!= current_season,阻止用户创建,更新或销毁播放器。
  2. 使用已在Player模型中提供的updated_at列基本上执行相同的操作。创建一个解析日期时间并将其转换为对您更有用的东西的方法,可能是季节编号或类似的东西。