Rails:选择模型

时间:2015-06-18 14:29:46

标签: sql ruby-on-rails activerecord associations

我有一个模型Shop

class Shop < ActiveRecord::Base
  has_and_belongs_to_many :services
end

和模型Service

class Service < ActiveRecord::Base
  has_and_belongs_to_many :shops
end

我想查询提供所有以下服务的每家商店:

  1. 赔偿
  2. 指教
  3. 优惠
  4. 因此,请返回服务包含reparation AND advise AND shipping的所有商店。

    仅使用ActiveRecord查询是否可以这样做?

    谢谢!

1 个答案:

答案 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。