我正在开发一个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
答案 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检查这些集合是否包含该用户。