【问题标题】:Rails ActiveRecord: How to select all users with a given permission?Rails ActiveRecord:如何选择具有给定权限的所有用户?
【发布时间】:2012-05-13 23:41:53
【问题描述】:

我有一个称为用户的模型,其中一些被认为是作者。这是通过一个名为“角色”的表来完成的,该表列出了许多不同的角色:“作者”就是其中之一。名为 Permissions 的表中的多对多关联链接角色和用户。

为了检查用户是否具有作者权限,我有一个方法运行链接到该特定用户的权限,并返回其中是否有任何一个也链接到作者权限。

这个系统对我很有帮助。但是,它使在网站上搜索和订购作者变得笨拙。我想做的是简单而优雅的事情,最好是一个命名范围,它允许我说诸如 Users.authors.order("date_joined") 之类的东西。

就像现在一样,除了将所有用户从数据库中拉出,一次运行一个,搜索他们的作者权限之外,我没有任何方法可以获取“作者”用户组,并且然后将它们添加到用户数组中(如果找到)。

这似乎很不优雅,尤其是当我每次想在视图中显示作者列表时都必须这样做。

有没有更好的办法?

编辑——解决方案:

按照下面的有用建议和http://railscasts.com/episodes/215-advanced-queries-in-rails-3?view=asciicast 的提示,我整理了以下内容。

在 User.rb 中:

    class User < ActiveRecord::Base
      scope :authors, joins(:permissions) & Permission.author_permissions
      scope :admins, joins(:permissions) & Permission.admin_permissions

在 Permission.rb 中:

    class Permission < ActiveRecord::Base
      scope :author_permissions, where("role_id = ?", Role.find_by_rolename("author"))
      scope :admin_permissions, where("role_id = ?", Role.find_by_rolename("administrator"))

瞧!现在我可以打电话给Users.authors,它就像一个魅力。

【问题讨论】:

    标签: sql ruby-on-rails ruby-on-rails-3 activerecord named-scope


    【解决方案1】:

    保留现有的架构结构,但确保添加正确的表索引。

    然后查询特定角色的用户可以做

    User.all(:joins => :roles,
             :conditions => {:roles => {:id => pick_a_role_id}})
    

    【讨论】:

    【解决方案2】:

    你看过CanCan吗?它可能需要一些重构,主要是创建一个current_user 方法。可以找到角色指南here

    【讨论】:

    • 好建议。 Ryan Bates 是我个人的 Rails 英雄,所以我对 CanCan 非常满意……一旦我有时间进行重构。感谢您的提醒。
    • @isthmus 而CanCan 很棒,它与角色分离。所以你仍然需要自己做这部分。或者使用gem等。基本上,使用CanCan不会解决你在这里发布的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    相关资源
    最近更新 更多