我有一个模型Shop
:
class Shop < ActiveRecord::Base
has_and_belongs_to_many :services
end
和模型Service
:
class Service < ActiveRecord::Base
has_and_belongs_to_many :shops
end
我想查询提供所有以下服务的每家商店:
因此,请返回服务包含reparation AND advise AND shipping
的所有商店。
仅使用ActiveRecord查询是否可以这样做?
谢谢!
答案 0 :(得分:2)
有关如何在sql中执行此操作,请参阅MySQL: Select records where joined table matches ALL values。
对于一个简单的方法,它可以执行一系列简单查询而不是单个复杂查询,您可以这样做:
#starting with the services in an array called @services
#(which could come from params[:service_ids] for example)
#find shops which have ALL these services.
shop_ids = @services.map(&:shop_ids).inject{|a,b| a & b}
@shops = Shop.find(shop_ids)
关键是.inject{|a,b| a & b}
:inject是一个数组方法,它在第一个和第二个元素(a和b)之间执行一个函数,然后再次使用块的结果,第三个元素等,通过阵列工作。 &
运算符是数组相交的,因此最终只能使用为所有服务返回的shop_ids。