CanCan Access Block

时间:2013-08-27 23:49:27

标签: ruby-on-rails ruby-on-rails-4 cancan

我正在开发一个Rails 4应用程序,它使用CanCan来授予用户访问权限,而我正在处理一个can阻止,但它似乎写得不好,我想它的伪代码,它是我想要的工作能力。是否可以将其更改为更好或更有效?我也试图避免不必要的问题,这可能会使请求需要更长的时间来处理。

can :manage, User do |u|
  u.id.eql?(user.id) || u.account.founders.includes(u) || u.account.collaborators.includes(u)
end

1 个答案:

答案 0 :(得分:2)

您已经在这里获得了正确的代码。以下是我的表现:

can :manage, User do |u|
  u.id == user.id ||
  u.account.founders.exists?(u.id) ||
  u.account.collaborators.exists?(u.id)
end

使用==进行比较是Ruby的标准。很少使用eql?

exists?方法将执行轻量级数据库查询,如果数据库确实在这些记录中包含该ID,则返回true。之前你是如何做错的,因为includes是一个热切加载关联的ActiveRecord方法。即使您使用了类似名称的include?方法,它仍然会加载该帐户的所有创建者和协作者,然后使用Ruby检查这些集合是否包含该用户。