用户有权管理特定位置和类别组合的文章。
例如,Dave可能被允许管理巴黎的HR文章。保罗可能被允许管理伦敦的商业文章。
模型及其关联如下:
我可以说:
has_permission_on :articles, :to => :manage do
if_attribute :location => { :permissions => { :user_id => is {user.id} }, :category => { :permissions => { :user_id => is {user.id} } }
end
当我在文章记录(其类别ID为1893,位置ID为2939)上调用allowed_to?(:delete)时,将运行以下查询:
SELECT `categories`.* FROM `categories` WHERE `categories`.`id` = 1893 LIMIT 1
SELECT `permissions`.* FROM `permissions` WHERE (`permissions`.category_id = 1893)
SELECT `locations`.* FROM `locations` WHERE `locations`.`id` = 2939 LIMIT 1
SELECT `permissions`.* FROM `permissions` WHERE (`permissions`.location_id = 2939)
我需要运行的是:
SELECT `permissions`.* FROM `permissions` WHERE (`permissions`.category_id = 1893 AND `permissions`.location_id = 2939)
有没有办法实现这个目标?
更新
好的,我现在在文章模型中有一个实例方法:
def permitted_user_ids
Permission.select('user_id').where(:location_id => location_id, :category_id => category_id).map(&:user_id)
end
我的规则现在是:
has_permission_on :articles, :to => :manage do
if_attribute :permitted_user_ids => contains { user.id }
end
现在,当我在类别ID为1893且位置ID为2939的文章记录上调用allowed_to?(:delete)(或读取/更新/创建/管理)时,将运行以下查询:
SELECT user_id FROM `permissions` WHERE `permissions`.`category_id` = 1893 AND `permissions`.`location_id` = 2939
......这正是我想要的。
除了,with_permissions_to范围表现得非常奇怪。
Article.with_permissions_to(:read)
现在生成:
SELECT `articles`.* FROM `articles` WHERE (`articles`.`id` = 9473)
...其中9473是当前用户的ID!
我很困惑。
答案 0 :(得分:0)
您可以使用子类并使用cancan管理权限。 您可以拥有顶级文章,然后所有类型的文章都可以是子类,并且在子类中使用cancan来管理他们的权限。
答案 1 :(得分:0)
这应该是评论,但我仍然是45岁:(
您说permission
属于user
,location
和category
。
因此,权限表将具有user_id,location_id和category_id列。
如果确实如此,那么为什么要声明类别belongs_to
权限和位置belongs_to
权限?当然这种关系应该是has_many
?
你应该在没有外键(类别和位置)的模型中使用has_many
,在模型上使用belongs_to
(许可)。
请原谅我,如果所有这些只是你做的错误,你真正的意思是权限belongs_to用户和has_many位置和类别。