Rails 复杂的 Active Record 关系
Rails Complex Active Record Relationship
我脑子里有一个复杂的活动记录关系,想知道我将如何完成它。本质上:
一个用户可以创建一个看板。然后用户可以将其他用户添加到该板以进行协作编辑。添加的用户组成 团队。每个添加的用户在每个版块中都有一个 角色 (管理员、编辑、查看者)。
我正考虑这样设置:
一个用户有很多看板
A Board 有很多 Users through Teams
一个团队有很多用户?
角色部分让我很困惑。我是否必须设置一个 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 以缩短查询。
我脑子里有一个复杂的活动记录关系,想知道我将如何完成它。本质上:
一个用户可以创建一个看板。然后用户可以将其他用户添加到该板以进行协作编辑。添加的用户组成 团队。每个添加的用户在每个版块中都有一个 角色 (管理员、编辑、查看者)。
我正考虑这样设置:
一个用户有很多看板
A Board 有很多 Users through Teams
一个团队有很多用户?
角色部分让我很困惑。我是否必须设置一个 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 以缩短查询。