更接近用户排序

时间:2013-10-14 13:58:02

标签: ruby-on-rails ruby google-maps geocoding

我有一个带有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进行排序。有没有简单的方法呢?

2 个答案:

答案 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的答案之前我已经制作了我的代码,所以我不知道他的答案是否有效。 我更喜欢我的解决方案,因为它可以在任何数组上调用,而不是在地理编码实例上调用的其他数组。

但是,我不知道哪种解决方案最快。