找到所有Obj谁的Delivery Radius在地理编码地址内

时间:2014-07-09 13:03:26

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

我在我的Rails应用程序中写了一个函数,它没有通过气味测试,我不确定如何重构。

目前,用户可以在表单中输入地址,我的目标是吐出任何在给定交付半径范围内的交付公司。现在看起来像这样:

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

YIKES那很难看。我不确定如何使用where SQL语句来获得相同的结果......

1 个答案:

答案 0 :(得分: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

  

我们正在使用double来存储latitudelongitude。另外我们   预计算(通过触发器)所有可预先计算的值   只看一点。我目前无法访问   我们正在使用的公式,稍后会添加。这是针对一个优化的   最佳速度/精度平衡。