Rails 5.选择常用关联

问题描述:

我有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则不会。 如果只选择洗车,然后得到同样的乔希和海伦阵列。如果选择了神经外科手术和身体双重手术,那么不会得到 - 这些大师都不会提供这两种服务。

可以实现这一目标这样也

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