我有has_and_belongs_to_many, through: 'table_name'
我们可以在这里看到:
角色
module Xaaron
class Role < ActiveRecord::Base
extend FriendlyId
friendly_id :role, use: [:slugged, :history]
has_and_belongs_to_many :permissions, join_table: 'permissions_roles'
validates :role, presence: true
validates_uniqueness_of :role
def has_permission?(permission_name)
permissions.where(permission: permission_name).any?
end
def permission_names=(names)
names.each do |name|
permission = Xaaron::Permission.where(permission: name)
if permission
self.permissions = permission
end
end
end
end
end
权限
module Xaaron
class Permission < ActiveRecord::Base
extend FriendlyId
friendly_id :permission, use: [:slugged, :history]
validates :permission, presence: true, uniqueness: true
end
end
我遇到的问题是角色permission_names
,我可以传递一个名称数组:['can_create', 'can_edit', 'can_delete']
,它会检查它们是否存在。然而,它只会在连接表中添加一个,它将覆盖那个与下一个,然后是最后一个,导致关系只显示一个角色的一个权限,当它应该是一个角色的三个权限
所以我打开了rails c
并执行了以下操作:
@role.permissions.create(permission: 'example')
我发现直接通过这种类型的链接,我可以为角色创建多个权限。我不想动态为角色创建多个权限。我想为已经存在的角色分配权限,并分配一个或分配100并让它们全部显示。
我需要做什么,@role.permission_names(['perm1', 'perm2', ...])
,并让它为该角色分配所有权限(如果存在)?
答案 0 :(得分:1)
您的permission_names=
方法定义是问题所在。在其中,您将self.permissions
设置为包含单个元素的数组。
试试这个。
def permission_names=(names)
self.permissions = Xaaron::Permission.where(name: names)
end