Rails способ для запроса таблицы соединений в has_and_belongs_to_many - PullRequest
4 голосов
/ 22 марта 2010

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

Я хочу иметь метод, который возвращает всех пользователей с данной ролью. В 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

Ответы [ 5 ]

9 голосов
/ 22 марта 2010

Обычно ассоциации HABTM включают этот метод по умолчанию!

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

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

role = Role.last

users = role.users

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

Дополнительная информация http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_and_belongs_to_many

8 голосов
/ 22 марта 2010

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

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

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

2 голосов
/ 22 марта 2010

Как насчет

    User.find(
      :all,
      :include => :roles,
      :conditions => ["roles.id = ?", role.id])
0 голосов
/ 06 ноября 2017

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

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
0 голосов
/ 22 марта 2010

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

users = Role.find(:all, conditions => ["id = ?", role_id]).map{ |role| role.users }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...