2009-06-28 160 views
0

我正在尝试为一些个人开发创建一个简单的Web应用程序,但是我遇到了一个障碍,我希望别人会发现这个障碍。我创建了工作班,但我不确定如何定义他们的关系,或者他们的模型是否合适。Ruby on Rails中的对象和关系

为了讨论的方便,我有以下类别已经存在:用户,团队,运动员

我追求的功能是使用户通过添加创建一个团队一名运动员到球队对象。其他用户可以向球队添加球员,也可以在球队名单上为现有运动员添加替代方案。基本上,我想创建一些类来包装一系列运动员对象,我们将其称为AthleteArray

如果我的理解是正确的,这是将是适当的关系:

  1. 所以一个团队有一对多AthleteArrays
  2. AthleteArray享有以下权利─很多运动员属于 a 团队
  3. 运动员属于对一个用户,并会属于对一个AthleteArray
  4. 用户有很多运动员,但这将是他们参与的程度。

由于AthleteArray类将没有任何属性,是明智将其创建为一个ActiveRecord对象(将它仅仅有一个ID)?有没有另一种方法来实现这个想法(你可以定义团队类,有一个运动员对象数组数组)?我对RoR知之甚少,但我认为这将是一个开始web开发的好地方。任何帮助,将不胜感激。提前致谢!

编辑:运动员,队伍和运动员阵容的名字并不重要。假设运动员基本上是一个评论,对运动员列表进行了验证。复制是可以接受的。如果我理解所发布的答案,我基本上应该创建一个中间班级,并且需要他们父母的ID。

对Omar的回应: 最后,我想添加投票系统。因此,在创建基本团队之后,用户可以单独建议替换给定的播放器,用户可以投票选出最佳选择。举例来说,如果我有创造了球队chess_players的:

  1. 菲舍尔
  2. 卡斯帕罗夫
  3. 弗拉基米尔·克拉姆尼克

有人会点击卡斯帕罗夫,并决定一个更好的运动员会深蓝,所以这个选项会出现在Kasparov下,直到收到更多的选票。对于每个角色都会发生同样的过程,但与评论系统不同,您无法响应“深蓝”并替换其他玩家,您只需对位置编号2作出回应,并建议其他玩家。

回答

1

权在数据库中表示这个,所以如果我正确地理解这个问题,会有运动员团队的许多可能的组合,这可能会或可能不会使用相同的运动员?

这里听起来有点可能在你的模型的命名。不太喜欢AthleteArrays的气味。

has_many_through可能是您需要从您的团队访问运动员的内容,例如

has_many :athletes, :through => :team_permuations # your AthleteArray model 

乔什Susser有很多的,而我的猜测是你所需要的,因为根据您的规格,理论上它可以是可能的运动员属于任意数量的团队很多协会的老综述。我想最好的事情是,你可以在你的多对多关联中拥有自动填充的审计列(created/updated_at/on),这是一件好事。

http://blog.hasmanythrough.com/2006/4/20/many-to-many-dance-off

,如果你认为我已经明白这个问题错了,请发表评论。

+0

我编辑了我的问题。希望现在有点可以理解。感谢您的回应! – Grantismo 2009-06-28 19:57:57

1

如果我明白你的需要,这是可以通过has_many:through解决的。

基本上可以像

athletes: 
    id 
    other_fields 

teams: 
    id 
    other_fields 

roster_items: 
    id 
    team_id 
    athlete_id 
    position 
    is_active #is currently on the team or just a suggestion 
    adding_user_id #the user who added this roster item 

class Athlete < ActiveRecord::Base 
    has_many :roster_items 
end 

class Team < ActiveRecord::Base 
    has_many :roster_items 
    has_many :athletes, :through => :roster_items 
end 

class RosterItem < ActiveRecord::Base 
    belongs_to :team 
    belongs_to :athlete 
    belongs_to :adding_user, :class_name => 'User' 
end