2017-10-11 54 views
1

我有2個模型,通過關聯與has_many關聯。Rails 5.選擇常用關聯

service has_many :masters, through: :master_services 
master has_many :services, through: :master_services 

我使用HMT的原因是我需要給每個主/服務交叉點提供一些細節,如價格和持續時間。

通過AJAX我向控制器發送了一個service_ids數組,並且我應該返回我的視圖中的一個Masters數組(重要!),他提供了所有列入的服務。

我現在得到:

services = params[:service_ids] #get array of service_ids 
@services = Service.where(id: services) #get array of arrays of services (mindblowing) 
@masters = @services.map {|service| service.masters } #get master for each service 

@masters.flatten! #transform array of arrays into a plain array 
@masters.uniq! #I don't need repeats 

但這@services = Service.where(ID:服務)返回這些服務都是高手。它被翻譯成SQL像

SELECT * FROM services WHERE id in ('5', '6', '7') 

它給出了一些結果,但不是我想要實現的。我需要一份主人名單,這些人員在所有這些服務中都是通用的。所以我需要你的幫助,親愛的社區。我不知道,也許有辦法通過ActiveRecord來完成,或者通過對結果數組進行一些轉換。

說明

大師喬希提供服務:洗車(ID 1),神經外科(ID 2),收縮(ID 3)。 海倫大師提供服務:縮水(id 3),洗車(id 1),身體雙層(id 4)。 弗朗索瓦法師提供服務:收縮(id 3)。

我想要如果收縮選擇,獲得所有的大師。 如果選擇收縮和洗車,只能獲得Josh和Helen,因爲他們提供這兩種服務,而Francois則不會。 如果只選擇洗車,然後得到同樣的喬希和海倫陣列。如果選擇了神經外科手術和身體雙重手術,那麼不會得到 - 這些大師都不會提供這兩種服務。

回答

1

可以實現這一目標這樣也

master_ids = MasterService.where(service_id: services) 
          .map(&:master_id) 
          .uniq 
masters = Master.where(id: master_ids) 

更新:

這樣就可以實現你在這個

尋找

services = params[:service_ids] 
masters = Master.joins(:master_services).where("master_services.service_id": services) 
@masters = masters.select {|master| (services - master.services.map(&:id)).empty? } 
@masters.uniq 

結果

masters.select {|master| (services - master.services.map(&:id)).empty? } 

我們選擇的主人誰擁有所有的服務,我們正在尋找,
例如,如果我們正在尋找服務= [1,3]

大師收縮了服務= [1,2,3]
我們正在做services - master.services.map(&:id)
這意味着[1,3] - [1,2,3] = []表示空。所以我們會選擇這個主人。因爲他擁有我們正在尋找的所有服務。

海倫大師 - [1,3] - [3,1,4] = []空,我們會選擇。
弗朗索瓦大師 - [1,3] - [3] = [1]不是空的。我們不會選擇。

+0

它給出了相同的結果。所有提供至少一種服務的主人,不是全部。 – Leeder

+0

對不起,你想在每項服務中都有主人嗎? –

+0

是的。讓我解釋。我將編輯我的主題帖子。 – Leeder