首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >acl9只查找满足object.accepts_role的模型对象?(role_name,current_user)

acl9只查找满足object.accepts_role的模型对象?(role_name,current_user)
EN

Stack Overflow用户
提问于 2009-10-30 05:05:16
回答 4查看 405关注 0票数 4

我是rails的新手,这是我第一次真正使用authlogic + acl9。我遵循了这两个插件的默认安装步骤。

到目前为止,一切都很好,但我很难找到一个优雅的解决方案来解决这个问题:

假设我有一个名为Products的模型类。在创建新的产品对象时,我将current_user指定为所有者:

代码语言:javascript
复制
current_user.has_role! :owner, @product

我注册了第二个用户,并确保此部分正常工作。

在products控制器中,我有一个index方法,简单地返回所有产品:

代码语言:javascript
复制
def index
  @products = Products.all
end

我的问题是:如何在产品上调用find方法,以便只获取current_user是:owner的那些产品?所以我使用acl9接口,这意味着:

代码语言:javascript
复制
@product.accepts_role?(:owner, current_user)

一种可能是首先检索所有产品,然后创建一个仅包含current_user产品的新数组。所以可能是这样的:

代码语言:javascript
复制
@products = []
products = Products.all
products.each do |p|
  @products << p if p.accepts_role?(:owner, current_user)
end 

这个解决方案看起来相当浪费。那么,什么才是正确的方法呢?

谢谢大家!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-06 09:43:37

在一个查询中执行所有操作如何:

代码语言:javascript
复制
@products = Product.all.select { |p| p.accepts_role?(:owner, current_user)}

但是这个想法仍然是你自己提出的。

票数 1
EN

Stack Overflow用户

发布于 2009-12-11 13:39:10

我最近在一个我正在做的项目中得出了同样的结论。

我很想在role和role_user表上对products表进行一些连接,但最终还是采用了上面的方法。

现在运行良好,但不能很好地扩展。

票数 0
EN

Stack Overflow用户

发布于 2009-12-24 05:28:34

我不知道你为什么要做任何连接。如果您遵循acl9的默认设置,那么您应该在用户及其角色之间具有多对多关系,并且在角色和每个授权对象之间具有多对一关系。因此,如果您在模型中正确指定了所有关系,则应该能够使用如下所示的简单操作来检索对象

current_user.roles.find(:first, :conditions => { :name => 'owner' }).products

您可能需要在角色模型中将产品具体描述为命名作用域或关联,并且可以通过将查找器包装到命名作用域中来进一步简化整个过程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1646547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档