1

我创建了一个应用程序,它根据传递给它的多个服务来查找服务提供者。这是通过 has many_through 完成的,所以有一个连接对象。基本上,如果用户要求提供服务 A 和服务 B 的服务提供商,我的范围将返回提供服务 A 和服务 B 的服务提供商或提供服务 A 或服务 B 的其他服务提供商。而不是这个,我们想仅限于提供两种服务的提供商。

我的范围如下所示:

  named_scope :with_services, lambda { |services| {
      :conditions => ["services.id IN (#{services.map{|s| s.id}.join(', ')}) 
                        AND service_options.service_owner_type='ServiceProvider' 
                        AND service_options.service_owner_id = service_providers.id"],
      :include => [:services, :service_options]
    }
  }

如您所见,我正在使用 IN 运算符来执行此操作。但是 IN 就像说“给我找任何有服务 A 或服务 B 的提供商”,而我真正想要的是“给我找任何同时有服务 A 和服务 B 的服务提供商”。

是否可以在单个查询中进行这种类型的过滤,或者如果它们不支持所有必需的服务,我是否需要进行复合查询或简单地遍历结果并将它们从列表中删除?

4

1 回答 1

1

我认为您可以通过为每个服务 A 和 B 提供服务列表来做到这一点。

因此,要么修改范围以获取两个列表:

:conditions => ["services.id IN (service_a) AND services.id IN (service_b)"] 

您甚至可能实际上可以调用范围两次

 Model.with_services(service_a).with_services(service_b)

同样无需额外费用,您可以简写您的数组操作来查找 id:

services.collect(&:id).join

&:id 相当于使用“|o| o.id”的块。

于 2010-01-25T05:43:04.923 回答