我有两个模型,与has_many连接:通过关联。
service has_many :masters, through: :master_services
master has_many :services, through: :master_services我之所以使用HMT:是因为我需要给每个主/服务交叉口提供一些细节,比如价格和持续时间。
通过AJAX,我将一个service_ids数组传送给控制器,我应该将一个大师数组返回到我的视图中,(重要!)世卫组织提供所有登记服务。
我现在拥有的是:
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来完成,或者通过对结果数组进行一些转换。
解释
乔希大师提供服务:洗车(id 1),神经外科(id 2),收缩(id 3)。海伦大师提供的服务:收缩(id 3),洗车(id 1),身体加倍(id 4)。弗朗索瓦硕士服务:收缩(id 3)。
我想如果心理医生被选中了,就把所有的大师都找出来。如果选择了心理医生和洗车,只有乔希和海伦,因为他们提供这两种服务,而弗朗索瓦没有。如果选择洗车,那就得到同样的乔希和海伦。而且,如果神经外科手术和身体双重手术被选中,那么无论如何,他们都得不到--没有一个能同时提供这两种服务。
发布于 2017-10-11 10:37:30
你也可以做到这一点
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不是空的。我们不会选择的。
https://stackoverflow.com/questions/46685837
复制相似问题