2014-07-09 2 views
0

필자는 Rails 앱에서 냄새 테스트를 통과하지 못하고 리팩토링하는 방법을 모르겠습니다.Obj의 배송지 찾기 Radius가 지오 코딩 된 주소 내에 있음

현재 사용자는 양식에 주소를 입력 할 수 있으며 목표는 지정된 배달 반경 내에있는 모든 배달 회사를 침뱉는 것입니다.

class Dealers < ActiveRecord::Base 
    validates :name, presence: true 
    validates :delivery_radius, numericality: { only_integer: true } 
end 

그래서 검색 내 컨트롤러에 와서 내가 이렇게 내가 쓴 방법 (available_deliveries)로 전화 : 오른쪽 지금은 다음과 같습니다

@dealers = Dealer.available_deliveries(Geocoder.coordinates(search_params)) 

search_params은 거리, 도시 & 상태입니다.

Dealer#available_deliveries 방법은 다음과 같습니다 추한

def self.available_deliveries(geo) 
    dealers = [] 
    Dealer.all.each do |dealer| 
     if dealer.distance_from(geo) <= dealer.delivery_radius 
     dealers << dealer 
     end 
    end 
    dealers 
    end 

이궁을. where 동일한 결과를 얻으려면 SQL 문을 수행하는 방법을 잘 모르겠습니다.

+0

'distance_from'은 어떻게 보이나요? – alexsmn

+0

안녕하세요 @ 거리 번호는 다음을 수행하는 지오 코더 (Geocoder) 메소드입니다 :'obj.distance_from ([40.714, -100.234]) # 임의의 점에서 객체까지의 거리' – Anthony

답변

1

백업 데이터베이스에 따라 지리적 공간 거리에 따라 인덱싱 할 수있는 기능을 사용하는 것이 좋습니다.

Postgresql :

찾기 기록은 반경에

는 이러한 확장에서 제공하는 또 다른 좋은 기능은이 기능이 우리가 간단한 특정 의 모든 레코드를 찾기 위해 비교 수행 할 수있는 earthbox(lltoearth($latlngcube), $radiusinmetres)입니다 반지름. 이것은 점 사이의 큰 원 을 돌려줌으로써 수행됩니다.보다 자세한 설명은 http://en.wikipedia.org/wiki/Greatcircle입니다.

현재 도시의 모든 이벤트를 표시하는 데 사용할 수 있습니다.

이러한 쿼리의 예 :

SELECT events.id, events.name FROM events WHERE earth_box({current_user_lat}, {current_user_lng}, {radius_in_metres}) @> 

ll_to_earth (events.lat, events.lng);

MySql

: 우리는 latitudelongitude를 저장하는 double를 사용하는

. 또한 사전 계산 (트리거에 의해)은 사전 계산이 가능한 모든 값을 한 지점에서만 표시합니다. 현재 현재 사용중인 수식에 액세스 할 수 없으므로 나중에 추가 할 예정입니다. 최적의 속도/정밀도 밸런스 인 에 최적화되어 있습니다.