2010-03-22 4 views
4

У меня есть модель пользователя и модель для подражания с rel_and_belongs_to_many reliation. Таблица join - role_users (два столбца - PK пользователя и роль) и не имеет соответствующей модели.Рельсы для запроса таблицы соединений в has_and_belongs_to_many

Я хочу иметь метод, который возвращает всех пользователей с заданной ролью. В SQL, что бы что-то вроде

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

Я вижу, что ActiveRecord Rails' имеет метод find_by_sql, но это только ожидает один результаты должны быть возвращены.

Что такое «Rails Way», чтобы дать мне список пользователей с заданной ролью, например.

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

ответ

8

Я принимаю роли в таблице, называемой «ролями». Было бы что-то вроде этого:

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

или для класса метод иш решения, как вы представить там, используйте named scope.

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 # находке: http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002263

Обратите внимание на разницу между: включается и включает в себя:. Там в Railscast для этого: http://railscasts.com/episodes/181-include-vs-joins

1

Как насчет

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

Это также работает:

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

Как правило, HABTM ассоциации включают в себя этот метод по умолчанию!

IE: Роль has_and_belongs_to_many: пользователи

Вам нужно просто позвонить пользователей метод для текущей роли:

роль = Role.last

пользователей = role.users

Это все волшебство ОРМ. Не изобретайте велосипед :)

Больше информации http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_and_belongs_to_many

0

Обновлено: Ваш Указанный метод может быть достигнуто следующим образом:

def self.find_users_with_role(role) 
    role.users 
end 

легко и может быть сделано в 2 этапа :

Сначала найдите ту роль, из которой вы хотите вернуть всех пользователей.

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

Во-вторых, найдите всех пользователей, связанных с этой ролью.

all_users = role.users

Это предполагает, что вы правильно настроить связь между user и role моделей с соотношением 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 
Смежные вопросы