【问题标题】:acl9 find just model object which satisfys object.accepts_role?(role_name, current_user)acl9 只找到满足 object.accepts_role?(role_name, current_user) 的模型对象
【发布时间】:2010-12-11 10:03:18
【问题描述】:

我对 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 

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

谢谢大家!

【问题讨论】:

    标签: ruby-on-rails acl9


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      现在运行良好,但无法很好地扩展。

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 你不能保证第一个 :owner 角色将是产品的角色,也许他们也拥有其他东西,在这种情况下 products 将为零。
        • 另外,Role 上不会有 products 方法
        【解决方案4】:

        将这些范围添加到您的 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 方法,如果您将其设置为其他值(这是很常见的做法),请在范围内进行调整。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-20
          • 2023-03-12
          • 1970-01-01
          相关资源
          最近更新 更多