0

我需要一個activerecord查詢來匹配params數組中的所有項目。匹配查詢中的所有活動記錄關係

可以說用戶has_many角色。每個角色都有一個名字。

當我通過['演員','製片人','歌手']。我希望查詢能夠向我返回具有所有這三個或更多角色的用戶。

但我下面的方法實現將返回用戶提供具有ATLEAST一個角色名匹配的數組中傳遞

我目前的方法,給出了基於發現任何標籤的結果,而不是「匹配所有」

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 

但是,如果你通過冠軍擦肩而過的角色([ '演員', '製片人','歌手'])你需要像這樣的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