Ruby on rails 轨道5。选择常见关联

Ruby on rails 轨道5。选择常见关联,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我有两个模型,通过关联与多个模型连接 service has_many :masters, through: :master_services master has_many :services, through: :master_services 我使用HMT的原因是:我需要给每个主/服务交叉点提供一些细节,比如价格和持续时间 通过AJAX,我将一组服务id传输到控制器中,我应该返回到我的视图中,返回一组提供所有登记服务的主控器(很重要!) 我现在得到的是: services = param

我有两个模型,通过关联与多个模型连接

service has_many :masters, through: :master_services
master has_many :services, through: :master_services
我使用HMT的原因是:我需要给每个主/服务交叉点提供一些细节,比如价格和持续时间

通过AJAX,我将一组服务id传输到控制器中,我应该返回到我的视图中,返回一组提供所有登记服务的主控器(很重要!)

我现在得到的是:

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:services)返回这些服务的所有主机。它被翻译成类似SQL的语言

SELECT * FROM services WHERE id in ('5', '6', '7')
它给出了一些结果,但不是我想要实现的。我需要一份大师的名单,他们都在这些服务中,所有服务的共同点。所以我需要你们的帮助,亲爱的社区。我不知道,也许有一种方法可以通过ActiveRecord实现,或者通过对生成的数组进行一些转换

解释

Josh大师提供服务:洗车(id 1)、神经外科(id 2)、心理医生(id 3)。 海伦大师提供的服务有:心理医生(身份证3)、洗车师(身份证1)和双人床(身份证4)。 弗朗索瓦大师提供服务:心理医生(id 3)

如果选择了心理医生,我想得到所有的大师。 如果选择了心理医生和洗车师,就只找乔希和海伦,因为他们提供这两种服务,而弗朗索瓦不提供。 如果只选择了洗车,那么得到相同的乔希和海伦数组。
而且,如果选择了神经外科手术和双体手术,那么没有一个可以同时提供这两种服务。

你也可以这样做

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]

Masters Shrink拥有服务=[1,2,3]
我们正在做
服务-master.services.map(&:id)

这意味着[1,3]-[1,2,3]=[]意味着空。所以我们将选择这个主控。因为他有我们要找的所有服务

海伦大师-[1,3]-[3,1,4]=[]空,我们选择。

弗朗索瓦大师-[1,3]-[3]=[1]不是空的。我们不会选择

它给出了相同的结果。所有提供至少一项服务的大师,而不是所有的。哦,对不起,你想让大师出现在每项服务中吗?完成,请查看。给出一个例外。我删除了@from@masters.select,现在它开始工作了。。但无论选择什么,都返回空数组。我没有得到什么(services-master.services.map(&:id))。空?是的,但似乎不起作用…:(宾果!services=services.map{| service | service.to|i}完成了。我的服务数组是字符串数组。我想ActiveRecord自己完成了对|i的操作,但是(services-master.services.map(&:id))没有。非常感谢!