【问题标题】:Find all Obj who's Delivery Radius is within Geocoded Address查找交货半径在地理编码地址内的所有 Obj
【发布时间】:2014-07-09 21:55:53
【问题描述】:

我在我的 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

哎呀,太丑了。我不确定如何执行where SQL 语句来获得相同的结果...

【问题讨论】:

  • distance_from 长什么样子?
  • 嗨 @uhn-nohn distance_from 是一种地理编码器方法,它执行此操作:obj.distance_from([40.714,-100.234]) # distance from arbitrary point to object

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


【解决方案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。另外我们 预计算(通过触发器)所有可预计算的值 只看一点。我目前无法访问 我们使用的公式,稍后会添加。这是针对 最佳速度/精度平衡。

【讨论】:

    猜你喜欢
    • 2011-04-24
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2011-10-22
    • 2018-12-29
    相关资源
    最近更新 更多