2010-08-24 39 views
1

我有具有以下特点belongs_to的HAS_ONE结构

There are Clubs 
Each Club has Teams 
Each Team has Players 

我有一个用户表的应用程序。用户表基本上包含俱乐部经理,球队经理和玩家登录系统的用户名和密码。

我应该如何构建的模型和表?

我打算创建俱乐部,球队和球员表。但我不确定展示如何构建它们与用户表之间的关系。

我可以在每个模型中创建user_id,但关系应该是Club belongs_to User,这看起来不正确。此外,我会结束与用户模型,具有以下内容

has_one :club 
has_one :team 
has_one :player 

这是不对的。用户在任何给定时间将只有其中一个。

是否有更好的方法来组织呢?

+0

目前还不清楚用户代表什么。如果俱乐部有球队,而球队有球员,那么用户是什么?它有什么,它有什么? – Chowlett 2010-08-24 12:26:39

+0

对不起。我编辑了这个问题来澄清用户表。 – Addy 2010-08-24 12:38:30

+0

啊,我明白了。用户本质上是俱乐部,团队或玩家之一的“经理”。你有能力改变数据库中的用户表吗? – Chowlett 2010-08-24 12:58:33

回答

1

下轨,has_one真是“至多有一个”。在User中拥有全部三个has_one修饰器是完全有效的。如果你想确保他们只有刚好一个,你可以添加一个验证,例如:

class User < ActiveRecord::Base 
    has_one :club 
    has_one :team 
    has_one :player 

    validate :has_only_one 

    private 

    def has_only_one 
    if [club, team, player].compact.length != 1 
     errors.add_to_base("Must have precisely one of club, team or player") 
    end 
    end 
end 

因为你必须改变在数据库中的用户表的能力,我想我会把club_idteam_idplayer_idusers,并有以下几点:

class Club < ActiveRecord::Base 
    has_one :user 
    has_many :teams 
    has_many :players, :through => :teams 
end 

class Team < ActiveRecord::Base 
    has_one :user 
    belongs_to :club 
    has_many :players 
end 

class Player < ActiveRecord::Base 
    has_one :user 
    belongs_to :team 
    has_one :club, :through => :team 
end 

class User < ActiveRecord::Base 
    belongs_to :club 
    belongs_to :team 
    belongs_to :player 

    validate :belongs_to_only_one 

    def belongs_to_only_one 
    if [club, team, player].compact.length != 1 
     errors.add_to_base("Must belong to precisely one of club, team or player") 
    end 
    end 
end 

我甚至被引诱在ClubTeamPlayer月更名为UserManager,或有has_one :manager, :class_name => "User" dels,但你的电话。

+0

我想过在用户表中添加三个ID。我们将如何确定已登录的“实体”。对于每个用户,只会有一个club_id或team_id或player_id。我将检查全部三项,以查看用户是否属于俱乐部,球队或球员。 从“用户”模型到Club/Team/Player的更好方法? – Addy 2010-08-24 13:57:59

+0

我怀疑你可以用'abstract_class?'或多态关联来做一些聪明的事情;但我倾向于在像'def managed'这样的用户中使用方法。俱乐部||团队||球员end' – Chowlett 2010-08-24 15:01:38