我有一个带有geocoder gem的rails 3应用程序。当用户在我的网站上创建一个帐户时,他会给我他的地址。使用地理编码器,我将他的lat和他的lng存储在我的数据库中,这样我就可以将他放在谷歌地图上。
当用户进行搜索时,他必须找到最接近他的用户。
目前,我使用地理编码器计算半径以查找其中的用户:
bounds_calc = Geocoder::Calculations.bounding_box(center, radius, units: :km)
users = User.where('? < addresses.lat AND addresses.lat < ?', bounds_calc[0], bounds_calc[2]).where('? < addresses.lng AND addresses.lng < ?', bounds_calc[1], bounds_calc[3])
我想要做的是从最近到最远的方式对users
进行排序。有没有简单的方法呢?
答案 0 :(得分:0)
假设您有一个地理编码的用户实例,您应该能够在地理编码的实例上使用'nearbys'方法。因此,对于用户,您应该能够编写
user.nearbys(radius_in_miles)
其中radius_in_miles是以英里为单位的边界圆的半径。默认排序最接近最远。
答案 1 :(得分:0)
我已经找到了如何使用Geocoder对我的用户数组进行排序:
results = results.sort_by { |x| Geocoder::Calculations.distance_between([x.latitude, x.longitude], [loc.first, loc.second]) }
在阅读Peter Goldstein的答案之前我已经制作了我的代码,所以我不知道他的答案是否有效。 我更喜欢我的解决方案,因为它可以在任何数组上调用,而不是在地理编码实例上调用的其他数组。
但是,我不知道哪种解决方案最快。