我在我的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语句来获得相同的结果......
答案 0 :(得分:1)
根据您的支持数据库,我建议您根据地理空间距离使用其功能进行索引。
以半径查找记录
这些扩展提供的另一项重要功能是
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);
我们正在使用
double
来存储latitude
和longitude
。另外我们 预计算(通过触发器)所有可预先计算的值 只看一点。我目前无法访问 我们正在使用的公式,稍后会添加。这是针对一个优化的 最佳速度/精度平衡。