4

我对 Rails 很陌生,这是我第一次真正使用 authlogic + acl9。我遵循了两个插件的默认安装步骤。

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

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

current_user.has_role! :owner, @product

我注册了第二个用户并确保这部分有效。

在产品控制器中,我有一个索引方法,只需返回所有产品:

def index
  @products = Products.all
end

我的问题是:我如何调用 Products 上的 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 

这个解决方案似乎很浪费。那么正确的方法是什么?

谢谢大家!

4

4 回答 4

1

如何在一个查询中完成所有操作:

@products = Product.all.select { |p| p.accepts_role?(:owner, current_user)}

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

于 2010-01-06T01:43:36.543 回答
0

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

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

现在工作得很好,但它不会很好地扩展。

于 2009-12-11T05:39:10.433 回答
0

我不确定您为什么要进行任何联接。如果您遵循 acl9 的默认设置,您应该在用户和他的角色之间建立多对多的关系,并且在角色和每个授权对象之间建立多对一的关系。因此,如果您在模型中正确指定了所有关系,您应该能够使用简单的方法来检索对象

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

您可能需要在角色模型中将产品专门描述为命名范围或关联,并且您可以通过将该查找器包装到命名范围中来进一步简化整个事情。

于 2009-12-23T21:28:34.263 回答
0

将这些范围添加到您的Product模型中:

scope :roled_by, -> ( r, u ) { where id: u.role_objects.select(:authorizable_id).where( :name => r, :authorizable_type => self ) }
scope :owned_by, -> (u) { roled_by :owner, u }

...并将其称为:Product.owned_by current_user-您可以使用相同的模式添加任意数量的其他角色范围(或者Product.roled_by :owner, current_user如果您愿意,只需调用)。

哦,请注意我使用了默认role_objects方法,如果您已将其设置为其他方法(这是很常见的做法),请在范围内进行调整。

于 2015-01-22T22:16:46.650 回答