2016-07-14 3 views
2

나는 Order by nearest - PostGIS, GeoRuby, spatial_adapter에서 찾은 해답이 해결책을 제공 할 수 없었기 때문에이 질문을하고 있습니다. n 가장 가까운 레코드를 특정 레코드의 lonlat로 반환 할 수있는 컨트롤러 메서드를 만들려고합니다. 질의하는 레코드가 같은 테이블에 있습니다. 이 개념은 SQL에서 완전히 수행하는 경우 그렇게 큰 스트레치가 아닙니다. 그 많은 링크 된 예에서 명확하고 아래 나는 결과를 얻은 특정한 경우입니다 :에 의해 가장 가까운 PostGIS, RGeo, 공간 어댑터를 사용하여

condos_development=# 
    SELECT id, name FROM condos 
    ORDER BY ST_Distance(condos.lonlat, ST_PointFromText('POINT(-71.06 42.45)')) 
condos_development-# 
    LIMIT 5; 

내 문제는 액티브와이 작품을 만드는 것입니다. @ dc10의 응답에서 영감을 얻은 메소드를 사용하고 있지만 RGeo 메소드 또는 직접 SQL을 통해 작동중인 쿼리를 작성할 수 없습니다. 여기에 지금까지이 작업은 다음과 같습니다

def find_closest_condos(num, unit) 
    result = Condo.order('ST_Distance(condos.lonlat, ST_PointFromText("#{unit.lonlat.as_text)}")') 
       .limit(5) 
end 

다음과 같이 시도의 응답은 다음과 같습니다

ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near "LIMIT" 10:29:50 rails.1 LINE 1: ...lonlat, ST_PointFromText("#{unit.lonlat.as_text)}") LIMIT $1

누군가가 이렇게 함께이 작업 쿼리를 넣어하는 방법에 대한 바른 길에 저를 설정할 수 있을까

Rails에서 작동하도록 만들 수 있습니까?

+0

"# {unit.lonlat.as_text}" "를"# {unit.lonlat.as_text} "로 변경하는 것 같습니다. –

+0

예. 맞습니다. – brianbancroft

답변

2

문제는 활성 레코드가 SQL에 대한 쿼리를 해결하는 방법과 Limit 절의 위치입니다. 쿼리를 다음과 같이 변경하는 경우 :

Condo.order("ST_Distance(lonlat, ST_GeomFromText('#{unit.lonlat.as_text}', 4326))") 
    .limit(num) 

이 내용을 찾아야합니다.