Ruby on rails Rails:使用活动记录动态选择

Ruby on rails Rails:使用活动记录动态选择,ruby-on-rails,activerecord,dynamic-sql,Ruby On Rails,Activerecord,Dynamic Sql,我需要创建一个动态SQL select语句,从一个名为Metros的表中获取城市和州的组合,该表与一组传入的GPS坐标之间的距离最小。注意,传入的GPS坐标集是从列表中提取的变量。为了计算我需要在经纬度上通过的距离,使用哈弗森公式,计算当前行与表Metros中所有291个城市之间的距离,然后选择最小城市state 在rails中,我遇到的问题是如何使用Metros表正确创建select语句,以允许传入可变GPS坐标,但也使用活动记录而不是传统SQL 目前,我已经走了这么远: Metros

我需要创建一个动态SQL select语句,从一个名为
Metros
的表中获取城市和州的组合,该表与一组传入的GPS坐标之间的距离最小。注意,传入的GPS坐标集是从列表中提取的变量。为了计算我需要在经纬度上通过的距离,使用哈弗森公式,计算当前行与表
Metros
中所有291个城市之间的距离,然后选择最小城市state

在rails中,我遇到的问题是如何使用
Metros
表正确创建select语句,以允许传入可变GPS坐标,但也使用活动记录而不是传统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')
行[纬度]、行[经度]
是传入的可变纬度和经度(当前行我正在比较
Metros
表中所有291个城市/州的GPS坐标,需要选择Haversine函数输出的距离最小的一个)。至于
lat2,long2
,他们需要参考
Metros
表中的纬度和经度列

在构建这个查询时,我不知道如何输入Haversine函数,以及如何使用activerecord从数据库中提取这些记录并进行计算


有没有更好的方法来完成我想做的事情?

您应该将haversine实现为SQL函数,然后调用ActiveRecord,如下所示:

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