2016-09-10 4 views
0

누구든지이 문제를 해결하는 데 도움이 될 수 있습니까? PG에서 JOIN select에서 배열의 결과를 읽으려고합니다. , partners.id, routes_rates.id_veh_class, routes_rates.min_price, routes_rates.km_rate, routes_rates.start을SQL 조인 쿼리 및 결과 배열 (레일)

을 routes.id :

i=0; 

sql = " 
    SELECT partners.id, routes_rates.id_veh_class, routes_rates.min_price, routes_rates.km_rate, routes_rates.start, routes.id FROM routes 
    JOIN partners ON routes.id_partner = partners.id 
    JOIN routes_rates ON routes.id = routes_rates.id_route 
    WHERE st_contains(routes.polygon, ST_GeomFromText('#{dvLoc}', 4326)) AND routes_rates.active = '1'" 

    sear = ActiveRecord::Base.connection.execute(sql) 
    sear.each do |sear| 

어떻게 내 모델에서 배열의 값을 읽을 수 있습니까?

내가하려고했던 meny 옵션 :

partner_id = sear.values[i]['partners.id']; 
partner_id = sear.values[@i][0]; 
partner_id = sear.values['@i']['partners.id']; 
partner_id = sear.values['#{@i}']["partners.id"]; 
partner_id = sear.values['#{i}'][0]; 
partner_id = sear.values["#{@i}"][0]; 

많은 감사, T

답변

1

당신은 아마 더 좋을 것이다 당신이 매우 큰 테이블과 메모리가 없다면 나눠 조인의 "레일 방식"에서 접근 사용은 주요 관심사입니다.

검색어를 보면 파트너, RoutesRate, Route의 3 가지 모델이있는 것 같습니다. 파트너는 많은 RoutesRate를 가진 많은 Routes를 가지고 있습니다 (그 말씨가 이상합니다. 나는 그 이름과 열 이름으로 판단하여 기존 데이터를 추측합니다).

해당 모델에서 적절한 belongs_to 및 has_many를 선언했다고 가정하면 ActiveRecord 연관을 사용하도록 코드를 변경할 수 있어야합니다.

rate_routes = RoutesRate.includes(:route).where("st_contains(routes.polygon, ST_GeomFromText('#{dvLoc}', 4326)) AND routes_rates.active = '1'") 

#includes 대부분의 경우 조인 또는 두 번째 쿼리에 대해 적절한 선택을합니다. 내가 본 것에서는 id 대신 id 대신 파트너 테이블을 사용하지 않는다. id_partner와 동일하다.

물론 이것은 쿼리의 추측에 불과하므로 모델이 다를 수 있습니다. 필요한 경우 조정하십시오. rate_route 인스턴스를 사용하고 .route을 호출하여 경로 정보에 액세스하십시오.

0

그러면 파트너 개체와 선택된 필드가있는 배열이 반환됩니다.

def method_name 
     return Partner.find_by_sql(" " 
      SELECT partners.id, routes_rates.id_veh_class, routes_rates.min_price, routes_rates.km_rate, routes_rates.start, routes.id  
      FROM routes 
      JOIN partners ON routes.id_partner = partners.id 
      JOIN routes_rates ON routes.id = routes_rates.id_route 
      WHERE st_contains(routes.polygon, ST_GeomFromText('#{dvLoc}',4326)) 
      AND routes_rates.active = '1'" 
end 

자세한 내용은 here을 참조하십시오. 방법이 app/model/partner.rb이라고 가정하고 Partner.method_name.class으로 전화하면 배열을 얻을 수 있습니다. 배열이 0이 아니라고 가정하면 Partner.method_name[0]SELECTed 필드가있는 person 객체를 제공합니다.

0

여러분 덕분에! 마침내 문제를 해결하여 마지막 열을 별칭으로 만들고 나열된 순서대로 값을 호출합니다. 파트너 및 경로와 상기 제 (routes.id) 값을 상기 제 덮어 쓰기 :

 partner_id = sear.values[0]; 
     id_veh_class = sear.values[1]; 
     min_price = sear.values[2]; 
     km_rate = sear.values[3]; 
     start = sear.values[4]; 
     id_route = sear.values[5]; 

문제

두 테이블에 열의 동일한 이름 (ID)으로 하였다.

t