0

Мне нужен запрос activerecord для соответствия всем элементам в массиве params.соответствует всем активным отношениям записи в запросе

позволяет говорить, что пользователь имеет несколько ролей. и каждая роль имеет имя.

, когда я передаю ['actor', 'производитель', 'singer']. Я ожидаю, что запрос вернет мне пользователей со всеми этими тремя ролями или более.

Но моя реализация ниже метод будет возвращать пользователей, имеющих по крайней мере один роль соответствия имен для тех, кто в массиве прошел

Мой текущий метод дает результаты, основанные на поиске любого из тегов, а не «MATCH ALL»

class User < ActiveRecord::Base 
    has_many :roles 

    def self.filter_by_roles(roles) 
     User.joins(:roles).includes(:roles).where(:roles => {:name => roles}) 
    end 
end 

Пожалуйста, помогите мне с решением для этого.

Я не хочу делать какие-либо операции массива после проверки запроса, если возвращаемые объекты результата содержат все роли или нет. Это связано с тем, что мне нужно вернуть объект Active Record Relation.

Заранее спасибо.

ответ

2

Попробуйте это.

User.joins(:roles).includes(:roles).where(:roles => {:name => roles}).group('usermail').having("COUNT(DISTINCt role_id) = 3") 

в предположении, что поле usermail используется для идентификации пользователей.

0

Вы можете попробовать это:

def self.filter_by_roles(roles) 
    scope = User.joins(:roles).includes(:roles) 
    roles.each do |role| 
    scope = scope.where(roles: {name: role}) 
    end 
    scope 
end 

Это проверялось, так что я не уверен, работает ли он.

0

Если передать role_ids массив ([1,2,3]) вы можете сделать что-л так:

def self.filter_by_roles(role_ids) 
    User.select{|user| (role_ids - user.role_ids).empty?} 
end 

Но если вы передаете роли по названию ([ 'актер', 'продюсер', ' singer ']) вам нужно smth вот так:

def self.filter_by_roles(roles) 
    role_ids = Role.find_all_by_title(roles).map(&:id) 
    User.select{|user| (role_ids - user.role_ids).empty?} 
end