0

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

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

1 回答 1

2

您几乎已经在这里获得了正确的代码。这是我的做法:

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

比较 using==是 Ruby 中的标准。eql?很少使用。

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

于 2013-08-27T23:53:55.780 回答