2014-07-22 2 views
1

차량 has_many 서비스. 서비스에는 has_many 유형 (0,1,2,3,4)이 있습니다.레일 액티브 레코드 크로스 탭 쿼리

차량의 각 서비스 유형을 마지막으로 완료했을 때의 마일리지를 보여주는 쿼리를 작성해야합니다.

내 MS 액세스 일간에 이것은 간단한 크로스 탭 (변환) 쿼리였습니다. 누군가 레일 환경에서 올바른 방향으로 나를 가리킬 수 있습니까? 감사합니다

이 내가 대조하기 위해 노력하고있어의 긴 손 버전 :

 @a_last = v.services.maximum(:mileage_closed, :conditions => ["closed = TRUE AND service_type_id > 0"]) 
     @b_last = v.services.maximum(:mileage_closed, :conditions => ["closed = TRUE AND service_type_id > 1"]) 
     @c_last = v.services.maximum(:mileage_closed, :conditions => ["closed = TRUE AND service_type_id > 2"]) 
     @d_last = v.services.maximum(:mileage_closed, :conditions => ["closed = TRUE AND service_type_id > 3"]) 
     @e_last = v.services.maximum(:mileage_closed, :conditions => ["closed = TRUE AND service_type_id > 4"]) 

감사합니다!

답변

1

간단한 대답은 결과를 범위를 반복하고 수집하는 것입니다 : 내가 추측하고있어

mileages = (0..4).collect do |service_type| 
    vehicle.services.maximum(:mileage_closed, :conditions => ["CLOSED = TRUE AND SERVICE_TYPE_ID = #{service_type}"] 
end 

당신이 대신 이상의 동일과 서비스 유형 ID를 검색하는 것을 의미한다.

그러나이 옵션은 실행될 때 5 개의 SQL 문을 작성합니다. 아마 성능에 나쁜 영향을주지는 않을 것입니다. 성능이 문제가되는 경우 SQL 문을 작성하여 결과를 찾습니다 (vehicle_id 및 service_type_id로 그룹화 한 다음 mileage_closed 열에 MAX()를 실행). 데이터 베이스. 그런 다음 단일 데이터베이스 왕복 여행에서 이러한 결과를 찾을 수 있어야합니다.

+0

안녕하세요 AJFaraday, 대단히 감사합니다. >는 실제로 0으로 간주됩니다. service_type은 5 service_item을 나타낼 수 있습니다. 1 service_type은 10 service_items (0 service_type의 5 service_items 포함) 2 = 15 등, 3 = 20 등을 계단식 스타일로 나타냅니다. 즉, service_type이 4 인 경우 0, 1, 2 및 3의 모든 요구 사항이 포함됩니다. 감사합니다. – jared

+0

귀하의 요구 사항을 저보다 잘 알고 계실 것입니다. 유형 번호가 0에서 4까지이고 service_type_id가 4보다 큰 서비스를 찾으면 아무 결과도 없을 것입니다. <와 <= < – AJFaraday

+0

의 차이점을 알아 두십시오. 감사합니다. 필요한 것뿐입니다! – jared