Sql 查找所有Obj谁';s的交付半径在地理编码地址内
我在Rails应用程序中编写了一个函数,它没有通过气味测试,我不确定如何重构 目前,用户可以在表单中输入地址,我的目标是吐出给定交付半径内的任何交付公司。现在看起来是这样的:Sql 查找所有Obj谁';s的交付半径在地理编码地址内,sql,ruby-on-rails,ruby,activerecord,rails-geocoder,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 @dealers = Deale
class Dealers < ActiveRecord::Base
validates :name, presence: true
validates :delivery_radius, numericality: { only_integer: true }
end
@dealers = Dealer.available_deliveries(Geocoder.coordinates(search_params))
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
搜索参数
仅限于街道、城市和州
我的Dealer#available_deliveries
方法如下所示:
class Dealers < ActiveRecord::Base
validates :name, presence: true
validates :delivery_radius, numericality: { only_integer: true }
end
@dealers = Dealer.available_deliveries(Geocoder.coordinates(search_params))
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
def自身可用交付(geo)
经销商=[]
经销商。所有人。每个人都做|经销商|
如果dealer.distance_from(geo)取决于您的后台数据库,我建议您根据地理空间距离使用其索引功能
:
在半径范围内查找记录
这些扩展提供的另一个重要功能是
接地盒(lltoearth($latlngcube),$radiusintres)
此功能允许
我们将执行一个简单的比较,以查找某个特定区域中的所有记录
半径这是通过函数返回大圆来完成的
点之间的距离,更详细的解释位于
这可以用来显示我们当前城市的所有事件
此类查询的一个示例:
SELECT events.id, events.name FROM events WHERE earth_box( {current_user_lat}, {current_user_lng}, {radius_in_metres}) @>
地对地(events.lat、events.lng)
:
我们使用double
来存储纬度
和经度
。此外,我们
预计算(通过触发器)在以下情况下可预计算的所有值:
只看一点。我目前无法访问
我们正在使用的公式,将在稍后添加。这是一个优化的解决方案
最佳速度/精度平衡
距离是什么样子?Hi@uhn nohndistance\u from
是一种地理编码器方法,它可以做到这一点:obj.distance\u from([40.714,-100.234])任意点到物体的距离