2014-11-20 3 views
0

Im on Rails 4 지오 코더를 사용하여 위치를 처리합니다.연관된 모델에서 지오 코더를 사용하여 거리별로 레코드 배열을 정렬하려면 어떻게합니까?

나는 두 가지 모델의 목록 및 위치

목록을

class Listing < ActiveRecord::Base 
    has_many :locations 
end 

위치

class Location < ActiveRecord::Base 
    belongs_to :listing 
    geocoded_by :full_address 
    after_validation :geocode 

    def full_address 
    [street, city, state, country].compact.join(", ") 
    end 
end 

나는 간단한 검색 기능을 만들려고 노력하는 곳의 도시에서 사용자 유형 바다의 50 마일 이내에있는 목록의 목록으로 돌아갑니다. rch 쿼리.

은 내 검색 기능이 나는 결과가 도시를 검색에 거리로 주문해야합니다 반환하려는 나의 리스팅 컨트롤러의 index 액션

def index 
    @query = Geocoder.search(params[:q]).first 
    @location = Location.near(@query.address, 50).order("distance") 
    @listings = Listing.find(@location.map(&:listing_id)) 
end 

에서 처리되고있다. 검색 할 때 반환 된 결과는 목록 ID로 정렬됩니다.

필자가이 일을 할 수 있었던 유일한 방법이므로

def index 
    @query = Geocoder.search(params[:q]).first 
    @location = Location.near(@query.address, 50).order("distance") 
    @listings = [] 
    @location.each do |l| 
     @listings.push(Listing.find(l)) 
    end 
end 

처럼 내 @listings 변수를 수행하는 것이었다 그러나 이것은 DB를 쿼리 및 임 기록과 검색의 많은 것을 걱정의 무리를 실행 , db에 많은 부담이있을 것입니다.

내가 원하는 방식으로 배열을 배열하는 데 더 간결한 방법이 있습니까? 감사.

답변

0

ActiveRecord.find은 배열을 취하고이 경우 단일 쿼리를 수행합니다. 개별 위치 Listing.find을 할 수 있다면 그래서 그것은 전체 배열을 할 그냥 쉽게 : 다음 세 가지 쿼리해야

def index 
    @query = Geocoder.search(params[:q]).first 
    @location = Location.near(@query.address, 50).order("distance") 
    @listings = Listing.find(@location) 
end 

: 지오 코더 검색, 위치 조회를 한 후 단일 목록 쿼리 .

(나는이 시점에서 더 이상 그것을 최적화 귀찮게하지 않을 것입니다.)

+0

응답 해 주셔서 감사합니다.하지만 귀하의 제안을 받으면 "위치를 방문 할 수 없습니다."오류가 발생합니다. – oobie11

+0

나는이 클래스들을 정확히 모르고있다.'@ location' 대신에'@ location.to_a'를 시도해 보라. –

+0

이것은 당신이 원하는 것을 줄 것이라고 확신하지 못합니다. '@ location'이 ids [1, 3, 4, 12]로 위치 레코드를 포함한다면'Listing.find (@location)'은 (Listing 1)에서 id 대신에 (즉 [1,3,4,12] 위치 기록 [1,3,4,12]에 속하는 기록. –

0

그래서 난 내 목록의 배열을 정렬 할 수있는 더 좋은 방법을 알아 냈어.

 @listings = Listing.find(@location.map(&:listing_id)).sort_by{|listing| listing.locations.first.distance_to(@query.address)} 

임 아마 내가 미래에 목록에 여러 위치가 할 수있는 기능을 추가 미래의 문제로 실행하는 것, 그러나 이것은, 다리 혹 내가 여기에 와서 이제 악 십자가

를 작동