Rails 复杂的 Active Record 关系

Rails Complex Active Record Relationship

我脑子里有一个复杂的活动记录关系,想知道我将如何完成它。本质上:

一个用户可以创建一个看板。然后用户可以将其他用户添加到该板以进行协作编辑。添加的用户组成 团队。每个添加的用户在每个版块中都有一个 角色 (管理员、编辑、查看者)。

我正考虑这样设置:

角色部分让我很困惑。我是否必须设置一个 TeamUser 模型,它有很多 Roles,或者每个 User 有很多属于委员会的角色?角色甚至必须是它自己的模型吗?

实现我的目标最有效的方法是什么?

如果一个用户可以属于多个团队并且可以担任多个角色,则逻辑可能类似于:

您需要一个联接 table 来提供用户和董事会模型之间的 N 对 N 关系。但问题是,当您将用户添加到看板时,您就赋予了他们在该参与中的角色。这是在该参与中保存角色信息的好地方。因此,我们的 UsersBoards join-table 转换为参与模型(或任何您喜欢的称呼)。我们的参与模型现在包含用户、董事会和角色信息(所有这些都是外键)。

我不完全理解团队模型的用途,但我认为在必要时将用户添加到团队很容易。它不会伤害我们的逻辑。

此外,如果您以后不打算添加更多功能,角色也可以是枚举。

class User < ApplicationRecord
  has_many :participations
  has_many :boards, through: :participations
end

class Board < ApplicationRecord
  has_many :participations
  has_many :users, through: :participations
end

class Participation < ApplicationRecord
  belongs_to :user
  belongs_to :board
  enum role: [ :admin, :editor, :viewer ]
end

user = User.first
user.participations.first.board #Board
user.participations.first.admin? #true
user.boards

并且您可以向模型添加辅助方法或 delegate 以缩短查询。