2014-09-22 93 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')