鉴于记录检索用户有权:通过cancan

时间:2015-12-15 09:33:19

标签: ruby-on-rails cancancan

我有一个使用cancan进行授权的rails项目。更新记录时,我想通知有权读取记录的用户更新记录。 Cancan可以轻松地让我检查特定用户是否有权对记录执行操作或获取特定用户可以操作的检索记录。但我可以通过康康来反过来吗?即给定一个特定记录检索所有被授权对其执行操作的用户?

2 个答案:

答案 0 :(得分:1)

我平均熟悉康康舞。话虽如此,这是我能想到的:

@myrecord = MyRecord.find(1)

authorized_user_ids = User.find_each do |user|
  user.id if Ability.new(user).can? :read, @myrecord
end.compact

puts authorized_user_ids
# => [1, 2, 5, 10, 78]

但请注意,这非常低效,因为它将循环遍历所有用户。您可能希望使用要实现的单独表/模型来执行缓存。

答案 1 :(得分:0)

  

给定一个特定记录检索所有被授权对其执行操作的用户?

没有

这就像问"可以向我展示当前登录的所有用户吗?" - 它没有能力去做因为范围不存在。

有几种方法可以达到你想要的效果。

最简单的方法是将通知(我不确定你是如何做到这一点)推送到应用程序的前端(这样,任何人都可能阅读)。

然后,正如CallmeSurge所述,您可以使用can? read来制作它,以便只有符合条件的用户才能真正调用数据:

#app/views/layouts/application.html.erb
<%= [[notification]] if can? :read, [[notification]] %>

-

另一种方法是使用ActiveRecord返回有资格使用您已使用的条件阅读通知的用户。这可以使用以下方法完成:

#app/models/user.rb
class User < ActiveRecord::Base
   def self.notify
      where(x: y)
   end
end

然后您就可以按如下方式设置通知:

User.notify.each do |user|
   user.notification.create .....
end