设置模型和数据库的最佳方法

时间:2014-11-01 19:04:35

标签: ruby-on-rails ruby database rails-activerecord models

我正在创建一个应对运动队的应用。目前我有两个型号。 Users.rb模型和Teams.rb模型。在应用程序的用户中,我希望有团队队长和队友。我想让队长在注册时创建团队。我希望队长属于一个团队,队友也属于一个团队。我希望球队只有一名队长。设置它的最佳方法是什么?我应该在用户模型中拥有队长和队友别名吗?或者制作一个captains.rb模型会更好吗?

3 个答案:

答案 0 :(得分:1)

好的,首先让我们列出关系假设,因为你的描述中有一些含糊不清:

用户可以:

  • 是很多船长
  • 参加许多球队

团队可以:

  • 属于一名船长
  • 有很多用户作为队友

据此我认为你需要3个型号:

  • 用户
  • 充当用户和团队之间的has_many_through联接表的队友

Teammate模型肯定会:

  • USER_ID
  • TEAM_ID
  • 可能的角色/类型字段

这样就可以根据您使用数据的方式决定应用程序。由于团队只有一名队长,您可以在队友模型中省略角色字段,只需将user_id或captain_id添加到实际的团队模型中。这意味着队长被视为特殊的,并且总是与其他队友不同。但是,我猜想你可能想要绕过团队的所有成员,包括队长。这就是为什么你应该让队长在队友模型上扮演特殊角色并添加验证以确保只有一名队长。然后,无论何时在整个团队中循环,你都不必为船长做特殊处理。

假设您使用角色字段,那么您的最终模型将具有以下关系:

队友

  • belongs_to:team
  • belongs_to:user

用户

  • has_many:teammates
  • has_many:团队,通过:: teammates

  • has_many:teammates
  • has_many:用户,通过:: teammates
  • has_one:team_captain, - > {其中角色:'队长' },class_name:'队友'

你也可以通过编造一个has_many来获得队长用户而不是队长team_mate来获得最后一个。这篇文章有关于高级has_one的一些有趣的细节:

http://www.rojotek.com/blog/2014/05/16/cool-stuff-you-can-do-with-rails-has_one/

答案 1 :(得分:0)

如果队长和队友有不同的属性,那么我认为最好将模型分开,但如果不是这样的话,为什么不为用户和团队之间的队友创建一个联接表,团队模型有一个所有者ID

架构示例:

团队(owner_id,.....)

队友(user_id,team_id,....)

这将帮助您使用团队模型中的owner_id列将Team和User模型之间的belongs_to关联设置为Captain,其他成员可以由has_many团队成员通过Teammates Model完成,甚至可以使用has_and_belongs_to_many关联。 通过这种方式,您将设法让一个用户拥有一个团队甚至是其他团队中的队友。

另一个想法是让连接表中的所有成员使用额外的列来决定其在团队中的角色,如果您将来要添加更多角色,这将为您提供更多控制,并定义您的验证和勺子以这种方式服务。

答案 2 :(得分:0)

我会这样做:

在开始时,应用允许您注册为“用户aka团队所有者”或“队友”

  1. Users.rb - 可以创建团队并邀请其他队友。有行政权利。
  2. Teams.rb - 属于User,有很多队友。
  3. Teammates.rb - 属于团队。
  4. 所有指定的队友都可以使用布尔值显示admin-visible复选框“captain”。这可以避免再创建一个db表。除非“队长”是“真实”,否则队友状态是“简单的球员”。否则就是“船长”。
  5. 其他方式是允许用户创建团队和队友。

    1. 用户将拥有团队和队友。
    2. 队友属于用户,属于团队。
    3. Team belongs_to User and has_many Teammates。