2014-09-22 81 views
2

我需要創建一個動態SQL選擇語句,從一個名爲Metros的表中獲取城市,州與州的組合,距離一組傳入的GPS座標中的距離最小。請注意,傳入的GPS座標集是將從列表中拉出的變量。爲了計算我需要能夠通過經度和緯度的距​​離,並使用半正式公式,計算表Metros中當前行與所有291個城市之間的距離,然後選擇最小城市狀態。Rails:動態選擇活動記錄

在rails中,我遇到的問題是如何正確創建Metros表的select語句以允許傳入可變GPS座標,但也使用Active Record而不是傳統的SQL。

目前,這是多遠我已經得到了:

Metros.select(
     "major_city 
     , major_state 
     ," haversine(row[latitude], row[longitude], lat2, long2)" as 'distance'") 
      .group("major_city,major_state").limit(1).order('distance') 

row[latitude], row[longitude]在可變緯度和經度(本行,我比較所有291個城市的傳遞/州GPS座標在Metros表需要選擇Haversine函數輸出距離最小的那個)。至於lat2, long2,他們需要參考Metros表中的緯度和經度列。

在構建此查詢時,我不知道如何輸入Haversine函數以及使用Active Record從數據庫中提取這些記錄並進行計算。

有沒有更好的方法來做我想做的事情?

回答

0

你應該實現半正矢爲SQL函數,然後調用ActiveRecord的像這樣:

Metros.select("major_city, major_state, haversine(?, ?, lat, long) as 'distance'", lat, long). 
    group("major_city,major_state"). 
    limit(1). 
    order('distance')