我是rails的新手,这是我第一次真正使用authlogic + acl9。我遵循了这两个插件的默认安装步骤。
到目前为止,一切都很好,但我很难找到一个优雅的解决方案来解决这个问题:
假设我有一个名为Products的模型类。在创建新的产品对象时,我将current_user指定为所有者:
current_user.has_role! :owner, @product我注册了第二个用户,并确保此部分正常工作。
在products控制器中,我有一个index方法,简单地返回所有产品:
def index
@products = Products.all
end我的问题是:如何在产品上调用find方法,以便只获取current_user是:owner的那些产品?所以我使用acl9接口,这意味着:
@product.accepts_role?(:owner, current_user)一种可能是首先检索所有产品,然后创建一个仅包含current_user产品的新数组。所以可能是这样的:
@products = []
products = Products.all
products.each do |p|
@products << p if p.accepts_role?(:owner, current_user)
end 这个解决方案看起来相当浪费。那么,什么才是正确的方法呢?
谢谢大家!
发布于 2010-01-06 09:43:37
在一个查询中执行所有操作如何:
@products = Product.all.select { |p| p.accepts_role?(:owner, current_user)}但是这个想法仍然是你自己提出的。
发布于 2009-12-11 13:39:10
我最近在一个我正在做的项目中得出了同样的结论。
我很想在role和role_user表上对products表进行一些连接,但最终还是采用了上面的方法。
现在运行良好,但不能很好地扩展。
发布于 2009-12-24 05:28:34
我不知道你为什么要做任何连接。如果您遵循acl9的默认设置,那么您应该在用户及其角色之间具有多对多关系,并且在角色和每个授权对象之间具有多对一关系。因此,如果您在模型中正确指定了所有关系,则应该能够使用如下所示的简单操作来检索对象
current_user.roles.find(:first, :conditions => { :name => 'owner' }).products
您可能需要在角色模型中将产品具体描述为命名作用域或关联,并且可以通过将查找器包装到命名作用域中来进一步简化整个过程。
https://stackoverflow.com/questions/1646547
复制相似问题