Rails ActiveRecord:如何选择具有给定权限的所有用户?

时间:2012-05-13 23:41:53

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

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

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

这个系统对我有好处。但是,它使得在网站上搜索和订购作者变得笨拙。我想做的是简单而优雅的事情,理想情况下就像命名范围一样,可以让我说出像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,它就像一个魅力。

2 个答案:

答案 0 :(得分:3)

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

然后查询您可以执行的特定角色的用户

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

答案 1 :(得分:2)

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