1

渡された複数のサービスに基づいてサービスプロバイダーを見つけるアプリケーションを作成しました。これは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を持っているプロバイダーを私に与えてください」と言うようなものです。

このタイプのフィルタリングを単一のクエリで実行することは可能ですか、それとも複合クエリを実行するか、必要なサービスのすべてをサポートしていない場合は結果をループしてリストから削除する必要がありますか?

4

1 に答える 1

1

サービス A とサービス B のそれぞれにサービスのリストを提供することで、おそらくそれができると思います。

したがって、スコープを修正して 2 つのリストを取得します。

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

実際にスコープを2回呼び出すことさえできるかもしれません

 Model.with_services(service_a).with_services(service_b)

また、追加料金なしで、配列操作を簡略化して ID を見つけることができます。

services.collect(&:id).join

&:id は、「|o| o.id」を使用したブロックと同等です。

于 2010-01-25T05:43:04.923 に答える