以下是没有角色的基本模型:
组模型
class Group < ApplicationRecord
has_many :memberships
has_many :users, through :memberships
end
用户模型
class User < ApplicationRecord
has_many :memberships
has_many :groups, through :memberships
end
会员资格模型
class Membership < ApplicationRecord
belongs_to :group
belongs_to :user
end
每个小组应该有1个(只有一个)owner
,多个admins
(由所有者分配)和其他general
个成员。此外,所有权角色必须可转让。我的选择,正如我看到的那样:
在成员资格表上创建一个属性role
,并为其指定字符串值“owner”,“manager”或“general”。 [衰]
在会员资格表上为“所有者”,“经理”和“一般”创建多个布尔值。 [衰]
创建一个{1}模型/表,其中包含1列(“名称”)和3行(“所有者”,“经理”,“常规”),然后更新我的模型:
角色模型
Role
组模型
class Role < ApplicationRecord
has_many :memberships
has_many :users, through :memberships
has_many :groups, through :memberships
end
用户模型
class Group < ApplicationRecord
has_many :memberships
has_many :users, through :memberships
has_many :roles, through :memberships
end
会员资格模型
class User < ApplicationRecord
has_many :memberships
has_many :groups, through :memberships
has_many :roles, through :memberships
end
组模型
class Membership < ApplicationRecord
belongs_to :group
belongs_to :user
belongs_to :role
end
用户模型
class Group < ApplicationRecord
has_many :general_memberships, class_name: 'Membership'
has_many :admin_memberships, class_name: 'Membership'
has_one :owner_membership, class_name: 'Membership'
has_many :users, through :memberships
end
会员资格模型
class User < ApplicationRecord
has_many :general_memberships, class_name: 'Membership'
has_many :admin_memberships, class_name: 'Membership'
has_many :owner_memberships, class_name: 'Membership'
has_many :groups, through :memberships
end
我知道有像CanCanCan(Rails 5兼容?)和Groupify那样的宝石,但我想先了解我的所有选择。我认为选项#3可能是我最好的,至少没有使用宝石。想知道社区认为我的方案最佳实践。
答案 0 :(得分:1)
<强>更新强>
我最终使用以下解决方案并且在生产应用程序中对它非常满意。由于一个组只能拥有一个所有者,因此它为该角色使用了belongs_to关系。
对于Membership模型,我利用了活动记录枚举。由于枚举数组只保存两个值,因此简单地将“manager”布尔值添加到成员资格模型实际上会更有效。 True表示经理,false表示一般。但是我采用了enum方法,因为我预计在不久的将来需要额外的角色,并且使用枚举它们将非常容易添加。
组模型
class Group < ApplicationRecord
belongs_to :owner, class_name: 'User'
has_many :memberships
has_many :users, through :memberships
end
用户模型
class User < ApplicationRecord
has_many :owned_groups, class_name: 'Group', :foreign_key => 'owner_id'
has_many :memberships
has_many :groups, through :memberships
end
会员模式
class Membership < ApplicationRecord
belongs_to :group
belongs_to :user
enum role: [:general, :manager]
end