【发布时间】:2017-05-27 01:18:34
【问题描述】:
我正在尝试找出为我的应用程序设计一些数据库关系的最佳方法。我有许多多对多的关系。以下是一种此类关系的示例:
class User < ApplicationRecord
has_many :groups_users
has_many :groups, through: :groups_users
end
class Group < ApplicationRecord
has_many :groups_users
has_many :groups, through: :groups_users
end
class GroupsUser < ApplicationRecord
belongs_to :group
belongs_to :user
end
所以这将允许我定义哪些用户属于哪些组。但是,我还需要知道他们对组的访问级别是什么。所以在 groups_users 表中我有额外的属性,比如管理员、贡献者等。如果我想让用户成为组的管理员,我会做类似的事情
u = User.find(34)
g = Group.find(22)
gu = u.groups_users.where(:group => g).first
gu.update(admin: true)
整个设置工作正常,但我一直在研究使用 Rolify,它似乎适用于这种情况。 Rolify 允许我为类的实例设置用户角色,所以要执行上述操作,我会这样做:
u = User.find(34)
g = Group.find(22)
u.add_role(:admin, g)
我喜欢 Rolify 的想法,所以我想我可以这样做并摆脱连接表中的额外属性。但是现在我感觉我有点混合和匹配,因为我使用连接表来获取用户拥有的组(u.groups)但是我需要使用 Rolify 以某种方式获取每个组的访问级别.也许这就是这样做的方法......但我想到我可以使用 Rolify 并完全摆脱连接表。可以这么说,我只是添加了一个“基础”角色,例如:member。因此,我不会使用u.groups 来获取用户组,而是使用Group.with_role(:member, u)。我没有能力做像u.groups = [g1, g2, g3] 这样的事情,但我已经不得不搞砸了,以便为每个组设置用户访问级别。
所以我想我只是在寻找有关如何执行此操作的建议。我有许多涉及用户的多对多关系,我喜欢使用 Rolify 处理所有这些的想法,所以我没有一堆连接表和类,但作为 Rolify 的新手(和不是这方面的专家)我不确定我是否错过了这种方法的一些陷阱。
【问题讨论】:
标签: ruby-on-rails activerecord database-design associations rolify