渡された複数のサービスに基づいてサービスプロバイダーを見つけるアプリケーションを作成しました。これはhasmany_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を持っているプロバイダーを私に与えてください」と言うようなものです。
このタイプのフィルタリングを単一のクエリで実行することは可能ですか、それとも複合クエリを実行するか、必要なサービスのすべてをサポートしていない場合は結果をループしてリストから削除する必要がありますか?