2013-07-30 2 views
0

주어진 위치에서 가까운 사용자를 얻으려고합니다. 사용자의 위도와 경도가 있습니다 (주소에서 나옵니다).지오 코드로 작업하지 않는 국가 이름이있는 근처 위치를 검색하십시오.

이제 노스 캐롤라이나와 같은 용어를 검색 할 때 검색 결과를 보여 주지만 '유니트 스테이트'라는 국가 이름으로 검색 할 때 모든 결과가 표시되어야하지만 그렇지 않습니다. 결과를 보여라.

나는 이것을 위해 Geocoder 보석을 사용하고 있습니다.

컨트롤러 :

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

모델 :

geocoded_by :address1 

보기 :

Displaying all the results returned from @user 

모든 아이디어는 내가 지금 무엇을해야하는지가 반환됩니다 는 여기에 내가 뭘하는지입니다 국가 이름으로 검색하더라도 모든 결과가 표시됩니다.

+0

더 구체적인 검색어를 입력하면 작동합니까? (뉴욕 예를 들면?) –

+0

@MichaelSzyndel 예. 우편 번호를 사용하는 경우와 같이 특정 용어로 작동합니다. –

+0

그럼 국가를 검색하기 위해 지오 코딩을 사용하는 것은 무엇입니까? –

답변

1

지오 코더가 '미국'과 같은 메시지를 받으면 하나의 중심 좌표 쌍을 선택한 다음 검색합니다. 따라서 귀하의 경우 미국의 중심에서 20 마일 이내에있는 사용자를 검색합니다. 당신이 원하는 무엇

은, 컨트롤러, 예를 들어, 검색을 지오 코딩하고 그것이 입력의 종류

그래서 (등 국가)를 발견하는 것입니다

def search 
    search = Geocoder.search(params[:search]).first 

    if search.types.includes?('country') 
    @users = User.where(country: search.address) 
    else 
    @users = User.near(search.coordinates, 20) # Will be ordered by distance by default 
    end 
end 

주소 구성 요소를 데이터베이스에 저장해야합니다.

일관된 데이터를 가지고하는 가장 좋은 방법은 사용자 정의 지오 콜백을 실행하는 것입니다 :

class User < ActiveRecord::Base 
    geocoded_by :address do |obj, results| 
    if result = results.first 
     obj.street = result.street_address 
     obj.zip = result.postal_code 
     obj.city = result.city 
     obj.country = result.country 
     obj.latitude = result.latitude 
     obj.longitude = result.longitude 
    end 
    end 

    after_validation :geocode, if: :address_changed? 

    def address 
    "#{street}, #{zip} #{city}, #{country}" 
    end 

    def address_changed? 
    street_changed? || city_changed? || zip_changed? || country_changed? 
    end 
end 
0

@delba에 의해 허용 대답은 루비는 :includes?이없는, 거기에 하나의 작은 오타이며, 즉 중대하다 배열의 술어는 :include?입니다. search.types.include?('country')이어야합니다.

+0

실제로 더 많은 설명이 있지만 -o.k. – cramopy

+0

문제는 필자가 실제로 의견을 쓸 수 있도록 더 많은 포인트를 필요로하고 한 글자에 대한 편집 요청을 할 수 없기 때문에 내 시나리오를 이해할 수 있다고 생각합니다 :) –