Rails:带有活动记录的动态选择

时间:2014-09-22 13:11:45

标签: ruby-on-rails activerecord dynamic-sql

我需要创建一个动态SQL select语句来从名为Metros的表中获取城市,状态组合,其中一组传递的GPS坐标距离最近。请注意,传递的GPS坐标集是从列表中提取的变量。为了计算我需要能够在纬度和经度上传递的距离,并使用半正式公式,计算当前行与表Metros中所有291个城市之间的距离,然后选择最小值市,州。

在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]是传递的变量纬度和经度(当前行我正在比较Metros表中所有291个城市/州的GPS坐标,需要选择输出距离最小的那个Haversine功能)。至于lat2, long2,他们需要引用Metros表中的纬度和经度列。

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

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

1 个答案:

答案 0 :(得分:0)

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

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