Rails中查询has_and_belongs_to_many关联表的方法

3

我有一个用户模型和一个角色模型,它们之间有一个 has_and_belongs_to_many 的关系。连接表是 roles_users(两列 - 用户的主键和角色),没有相应的模型。

我想要一个方法,返回所有拥有特定角色的用户。在 SQL 中,这个查询语句大概是这样的:

SELECT u.id FROM role.r, roles_users ru WHERE r.role_id = #{role.id} AND r.role_id = ru.role_id

我看到Rails的activerecord有一个find_by_sql方法,但它只期望返回一个结果。

在Rails中,如何给我一个拥有特定角色的用户列表呢?

def self.find_users_with_role(role)
  users = []
  users << # Some ActiveRecord magic or custom code here..?
end
5个回答

9
我假设角色在名为“roles”的表中。它可能是这样的:
User.all(:joins => :roles,
         :conditions => {:roles => {:id => role.id}})

或者,如果需要类方法解决方案,就像你在上面展示的那样,可以使用命名作用域

named_scope :with_role, lambda { |role_id| { :joins => :roles, 
                                             :conditions => {:roles => {:id => role_id} } } }
# call it like so:
User.with_role(role.id)

以下是未经测试的示例,因此可能需要进行一些微调。

只是ActiveRecord::Base#find上的选项:http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002263

请注意::joins和:includes之间的区别。这方面有一个Railscast:http://railscasts.com/episodes/181-include-vs-joins


9

3

你能行吗?

    User.find(
      :all,
      :include => :roles,
      :conditions => ["roles.id = ?", role.id])

0

更新:您提到的方法可以这样实现:

def self.find_users_with_role(role)
  role.users
end

这很容易,只需两步即可完成:

首先,找到您想要返回所有用户的角色。

#Assume the role you want has the id of 3.
role = Role.find(3)

其次,找到与该角色相关联的所有用户。

all_users = role.users

这假定您正确设置了用户角色模型之间的关联,并使用关系has_and_belongs_to_many

class User < ActiveRecord::Base
  has_and_belongs_to_many :roles
#More codes below
end

并且

class Role < ApplicationRecord
  has_and_belongs_to_many :users
end

-3

这个也可以:

users = Role.find(:all, conditions => ["id = ?", role_id]).map{ |role| role.users }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接