繁体   English   中英

Ruby on Rails中的对象和关系

[英]Objects and Relations in Ruby on Rails

我试图为个人开发创建一个简单的Web应用程序,但是遇到了一个障碍,希望其他人会发现它很琐碎。 我已经创建了工作类,但是不确定如何定义它们之间的关系,或者它们的模型是否合适。

为了争辩,我已经存在以下类: 用户,团队运动员

我正在努力的功能是让用户通过向团队对象添加一名运动员来创建团队。 其他用户可以将运动员添加到团队中,也可以在团队花名册中为现有运动员添加替代者。 本质上,我想创建某种类来包装运动员对象数组,我们将其称为AthleteArray

如果我的理解是正确的,那么以下是适当的关系:

  1. 所以一个团队 会有很多 AthleteArrays
  2. 一个AthleteArray 会有很多 运动员 ,并且属于一个团队
  3. 运动员属于一个User ,并且将属于 AthleteArray
  4. 用户 会有很多运动员,但这就是他们参与的程度。

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

编辑:Athletes,Team和AthleteArrays的名称并不重要。 假设一名运动员基本上是一条评论,并根据一系列运动员进行了验证。 复制是可以接受的。 如果我理解所发布的答案,那么我基本上应该创建一个中间级类,该类使用其父母的ID?

是对Omar的回应:最终,我想添加一个投票系统。 因此,在创建了基本团队之后,用户可以针对给定球员单独提出替代建议,并且用户可以投票选出最佳选择。 例如,如果我创建了一个象棋玩家团队:

  1. 鲍比·菲舍尔
  2. 加里·卡斯帕罗夫(Garry Kasparov)
  3. 弗拉基米尔·克拉姆尼克

有人可能会点击“卡斯帕罗夫”,并决定一个更好的运动员将是“深蓝”,因此该选项将嵌套在“卡斯帕罗夫”下,直到获得更多选票为止。 每个角色都会执行相同的过程,但是与注释系统不同,您将无法响应“深蓝”并替换另一个玩家,您只需响应位置2,并建议另一个玩家。

如果我了解您的需求,可以通过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

是的,因此,如果我正确理解了这个问题,那么一个团队中可能会有许多运动员组合,这些人可能会或可能不会使用同一位运动员?

这里听起来有些不对劲,可能是在您的模型命名中。 不太喜欢AthleteArrays的味道。

has_many_through可能是您需要与团队联系运动员的条件,例如

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

乔什·苏瑟(Josh Susser)拥有许多协会的古老综述,我想这是您需要的,因为根据您的要求,理论上运动员可以属于任何数量的球队。 我想最好的是,您可以在许多对许多关联上自动填充审计列(创建/ updated_at / on),这是一件很高兴的事情。

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

如果您认为我理解的问题不对,请发表评论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM