【问题标题】:Best way to set up model and database建立模型和数据库的最佳方法
【发布时间】:2014-11-01 19:04:35
【问题描述】:

我正在创建一个与运动队打交道的应用。目前我有两个模型。一个 Users.rb 模型和一个 Teams.rb 模型。在应用程序的用户中,我希望有队长和队友。我想在队长签约时授予他们创建团队的特权。我希望队长属于一个团队,队友属于一个团队。我希望球队只有一名队长。设置它的最佳方法是什么?我应该在用户模型中有队长和队友别名吗?还是制作一个 Captains.rb 模型会更好?

【问题讨论】:

  • 队长和队友有什么不同的属性吗?
  • 只是一个警告:Rails 的惯例是对模型使用单数名词。 rails g model Users 会给你: [警告] 型号名称“用户”被识别为复数,使用单数“用户”。在运行生成器之前,用 --force-plural 覆盖或为此名词设置自定义变形规则。

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


【解决方案1】:

好的,首先让我们列出关系假设,因为您的描述有些模糊:

用户可以:

  • 做很多船长
  • 加入多个团队

团队可以:

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

从这里我认为你需要 3 个模型:

  • 用户
  • 团队
  • 团队成员充当用户和团队之间的 has_many_through 连接表

队友模型肯定有:

  • user_id
  • team_id
  • 可能的角色/类型字段

这就留下了您必须根据您将如何使用数据来决定应用程序的问题。由于一个团队只有一名队长,您可以省略队友模型中的角色字段,只需将 user_id 或 Captain_id 添加到实际的团队模型中。这意味着队长总是被视为特殊的并且与其他队友不同。但是,我猜测您可能希望循环访问包括队长在内的所有团队成员。这就是为什么你可能应该让队长在队友模型中扮演一个特殊的角色,并添加验证以确保只有一名队长。那么你在循环整个团队时不必对队长进行特殊处理。

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

队友

  • belongs_to :team
  • belongs_to :user

用户

  • has_many :队友
  • has_many :teams,通过: :teammates

团队

  • has_many :队友
  • has_many :users, through: :teammates
  • has_one :team_captain, -> { where role: 'captain' }, class_name: 'Teammate'

你也可以通过制定一个 has_many 来获得队长用户而不是队长 team_mate,从而对最后一个更感兴趣。这篇文章有一些关于高级 has_one 的有趣细节:

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

【讨论】:

    【解决方案2】:

    如果队长和队友具有不同的属性,那么我认为最好将模型分开,但如果不是这种情况,那么为什么不在用户和团队之间为队友创建连​​接表,并且团队模型具有所有者 ID .

    架构示例:

    团队(owner_id,.....)

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

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

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

    【讨论】:

      【解决方案3】:

      我会这样做:

      一开始应用程序允许您注册为“用户又名团队所有者”或“队友”

      1. Users.rb - 可以创建团队并邀请其他队友。拥有管理权限。
      2. Teams.rb - 属于用户并拥有许多队友。
      3. Teamates.rb - 属于 Teams。
      4. 所有分配的队友都可以有管理员可见的复选框“队长”,其值为布尔值。这可以使您免于再创建一个 db 表。除非“队长”为“真”,否则队友状态为“简单玩家”。否则就是“船长”。

      其他方式是允许用户创建团队和队友。

      1. 用户将拥有_many Teams 和 Teammates。
      2. 队友 belongs_to 用户和 belongs_to 团队。
      3. 团队属于_to User 和 has_many Teammates。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-18
        • 1970-01-01
        • 1970-01-01
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        • 2012-10-30
        • 2011-02-19
        相关资源
        最近更新 更多