2013-07-02 2 views
8

저는 Ryan Bates가 소개 한 루비에 지오 코더 젬을 사용합니다 (에피소드 273 http://railscasts.com/episodes/273-geocoder?view=asciicast). 그 에피소드에서, 그는 반경 50km 이내의 객체를 검색하기 위해 다음을 사용합니다 (사용자 모델을 사용하는 위치 모델을 사용하지만).지오 코더 거리 메서드가 없습니다

@users = User.near(params[:search], 50, :order => :distance) 

내가 포스트 그레스와 레일 4 응용 프로그램에이 코드를 실행, 그것은 라이언의 데모 애플리케이션에서

PG::Error: ERROR: column users.distance does not exist 

(코드는 여기 https://github.com/railscasts/273-geocoder/tree/master/siteseer-after)를 그의 위치 모델에 거리 열이없는 말한다 (필자의 사용자 모델에는 없기 때문에) distance은 Geocoder gem이 제공 한 것으로 가정했다. 그러나 지오 코더 http://rdoc.info/github/alexreisner/geocoder/master/frames에 대한 문서를 보면 distance 메소드가없고 다른 모든 거리와 같은 메소드가 동일한 오류를 생성합니다.

누구든지 거리별로 해당 쿼리의 결과를 주문하는 방법을 알고 있습니까?

업데이트 지오 코더 홈페이지 http://www.rubygeocoder.com/에이 예제를 사용하면 distance이 표시되지만 시도하면 사용자에게는 존재하지 않는다고 표시됩니다.

nearbys = Place.near("Omaha, NE", 50, 
    :order => "distance") 
bearing = nearbys.first.bearing # => 46.12 
Geocoder::Calculations.compass_point(
    bearing) # => "NE" 

업데이트

이것은 SQL이

ActionView::Template::Error (PG::Error: ERROR: column users.distance does not exist 
LINE 1: ...ngitude) * PI()/180/2), 2))) <= 50) ORDER BY "users".di... 
                  ^
: SELECT users.*, 3958.755864232 * 2 * ASIN(SQRT(POWER(SIN((43.7058645 - users.latitude) * PI()/180/2), 2) + COS(43.7058645 * PI()/180) * COS(users.latitude * PI()/180) * POWER(SIN((-79.3687137 - users.longitude) * PI()/180/2), 2))) AS distance, CAST(DEGREES(ATAN2(RADIANS(users.longitude - -79.3687137), RADIANS(users.latitude - 43.7058645))) + 360 AS decimal) % 360 AS bearing FROM "users" WHERE (users.latitude BETWEEN 42.98220558444576 AND 44.429523415554236 AND users.longitude BETWEEN -80.36976846878524 AND -78.36765893121476 AND 3958.755864232 * 2 * ASIN(SQRT(POWER(SIN((43.7058645 - users.latitude) * PI()/180/2), 2) + COS(43.7058645 * PI()/180) * COS(users.latitude * PI()/180) * POWER(SIN((-79.3687137 - users.longitude) * PI()/180/2), 2))) <= 50) ORDER BY "users".distance ASC): 
+0

해당 쿼리를 실행할 때 로그에 생성되는 SQL은 무엇입니까? SQL에는 계산 결과 인 '거리'열이 있어야합니다. 그것은 방법이 아니지만 그것을 주문할 수 있어야합니다. –

+0

OP를 SQL로 업데이트했습니다. 당신의 도움을 주셔서 감사합니다. – Leahcim

+0

다른 곳에서 뭔가 잘못되었습니다. SQL은 "ORDER BY 'users'.distance"를 수행하면 안됩니다. 그것은 단지 "거리에 의한 주문"이어야합니다. 방금 레일 3.2.13, 지오 코더 1.1.8 및 0.15.0 (postgres 버전 9.1.1)을 사용해 보았습니다. 뭔가 내가 너를 망치고있는 테이블 이름을 추가하고있다. –

답변

1

당신은 order: :distance을 지정할 필요가 없습니다를 생성하고, 결과는 기본적으로 거리에 의해 정렬됩니다.

-1

과 함께 Postgres를 사용할 때 검색어에 기호화 된 키 (이 경우 :distance)를 사용할 수 없습니다. 이 경우 'distance'문자열을 사용하면 문제를 피할 수 있습니다.

@users = User.near(params[:search], 50, :order => 'distance') 
-1

이 시도 : 따옴표

User.near(params[:search], 50).reorder("distance asc") 

넣어 orderding를이 테이블 열로 보지 않도록.

주문 (..) 주문을 재정의합니다.