我已经启动并运行了rails_authorization_plugin模型。
在我的网站上实施权限检查的最佳方式是什么?
当一个对象的实例应该可见时,我有复杂的条件,是否有一种有效的方法将它们链接在一起,这样我就不会因为循环返回的数据以过滤它而获取多组数据并研磨我的数据库?
我已经启动并运行了rails_authorization_plugin模型。
在我的网站上实施权限检查的最佳方式是什么?
当一个对象的实例应该可见时,我有复杂的条件,是否有一种有效的方法将它们链接在一起,这样我就不会因为循环返回的数据以过滤它而获取多组数据并研磨我的数据库?
有一种有效的方法:确保您只运行一个查询,并且您运行的查询准确地返回您想要的对象。当然,说起来容易做起来难。
处理此问题的一种方法是使用范围构建条件。
@posts = @thread.posts.not_deleted.this_week.not_secret
如果所有这些方法都是范围,那将只是一个查询。
如果您的条件太复杂而无法轻松地将它们设置为范围,您可能应该只编写一个方法来为用户返回可见对象。
class User
def posts_for(thread)
if is_admin?
thread.posts
elsif thread.owner == self
thread.posts.not_deleted
else
Post.find(:all, :conditions => something_complicated(thread, self))
end
end
end
我的应用程序有很多种类的对象和非常复杂的权限,因此我们使用 method_missing 捕获类似的调用,并将它们路由到知道如何进行所有各种查询的权限库。