2013-10-14 3 views
0

У меня есть приложение для рельсов 3 с драгоценным камнем геокодера. Когда пользователь создает учетную запись на моем веб-сайте, он дает мне свой адрес. С геокодером я хранил его lat и его lng в моей базе данных, чтобы я мог разместить его на карте google.Сортировать пользователей по ближе

Когда пользователь выполняет поиск, он должен найти для него самых близких пользователей.

На данный момент я вычислить радиус с геокодером найти пользователь в нем:

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 от ближайшего к самому дальнему. Есть ли простой способ сделать это?

+1

Возможно, этот драгоценный камень может вам помочь: https://github.com/geokit/geokit-rails. – JoJoS

+0

Я думаю, что если вы используете User.near, результаты будут автоматически отсортированы по расстоянию ... – sailor

+0

Вы вычисляете * ограничивающий прямоугольник * и выбираете пользователей в этом поле. – Stefan

ответ

0

Я нашел, как сортировать мой массив пользователей с геокодировщиком:

results = results.sort_by { |x| Geocoder::Calculations.distance_between([x.latitude, x.longitude], [loc.first, loc.second]) } 

Я сделал свой код, прежде чем читать ответ Питера Гольдштейна, так что я не знаю, если его ответ работает. Я предпочитаю свое решение, потому что его можно вызвать на любом массиве, а не на другом, который будет вызываться в геокодированном экземпляре.

Однако я не знаю, какое решение является самым быстрым.

+0

Я действительно не понимаю ваше решение, поскольку оно, похоже, не затрагивает первоначальный вопрос. Решение, написанное здесь (i), сначала требует, чтобы список пользователей был в памяти, что побеждает цель использования PostGis, и (ii) не налагает никаких ограничивающих прямоугольников, которые предположительно вводятся раньше, когда массив результатов в процессе постройки. Использование nearbys решает все это по одному запросу. –

0

Предполагая, что у вас есть экземпляр пользователя с геокодированием, вы должны использовать метод «nearbys» для геокодированного экземпляра. Таким образом, для пользователя, вы должны быть в состоянии написать

user.nearbys(radius_in_miles) 

где radius_in_miles радиус ограничивающего круга в милях. Заказ по умолчанию находится ближе всего к самому дальнему.

Смежные вопросы