2010-01-25 3 views
1

전달 된 여러 서비스를 기반으로 서비스 공급자를 찾는 응용 프로그램을 만들었습니다. 이것은 many_through를 통해 이루어 지므로 join 객체가 있습니다. 기본적으로 사용자가 서비스 A 및 서비스 B가있는 서비스 공급자를 요청하면 범위가 서비스 A와 서비스 B 중 하나를 제공하는 서비스 공급자 또는 서비스 A 또는 서비스 B를 제공하는 다른 서비스 공급자를 반환합니다. 두 가지 서비스를 모두 제공하는 제공자에게만 국한하십시오.Rails에서 명명 된 범위를 포함하는 쿼리가 아닌 포괄적 인 쿼리를 만드는 방법은 무엇입니까?

내 범위는 다음과 같습니다

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를 모두 가지고있는 서비스 제공 업체를 구하십시오"라고 말합니다.

단일 쿼리에서 이러한 유형의 필터링을 수행 할 수 있습니까? 아니면 복합 쿼리를 수행하거나 단순히 결과를 반복하고 필요한 서비스를 모두 지원하지 않으면 목록에서 제거해야합니까?

답변

1

나는

그러니 두 개의리스트를 취하도록 범위를 수정 서비스 A와 B

각 서비스의 목록을 제공하여 당신이 그것을 할 아마 수 있다고 생각 :

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

을 당신은 실제로 수도 ID를 찾아 두 번

Model.with_services(service_a).with_services(service_b) 

는 또한 추가 비용없이, 당신이 당신의 배열 조작을 나타내는 표현이 할 수있는 범위를 호출 할 수 :

services.collect(&:id).join 

& : id는 "| o | o.id "

+0

감사합니다. 나는이 질문을 언급하는 것을 잊어 버렸습니다 .1 개의 서비스 또는 5 개의 서비스가 전달 될 수있었습니다. 가장 좋은 방법은 없을까요? 서비스를 매핑하고 해당 SQL 스 니펫을 생성 하시겠습니까? 다음과 같이하십시오 : : conditions => [ "# {services.map {| s | –

+0

불행히도,이 방법을 시도 할 때 아무런 결과도 얻지 못합니다. 주어진 ID는 사용할 수 없기 때문에 믿을 수 있다고 생각합니다. '('+ s.id + ')}. 같거나 두 개의 상호 배타적 인 값입니다. 거의 복합 쿼리가 필요한 것 같습니다. 결과를 구문 분석하려면 for 루프를 사용해야 할 수도 있습니다. - \ –

관련 문제