Как мы получаем список пользователей в пределах определенного города?

#ruby-on-rails #ruby #elasticsearch

#ruby-on-rails #ruby #elasticsearch

Вопрос:

У меня есть список пользователей с полем city. Как мы получаем список пользователей, которые находятся примерно в 200 км от определенного города?

Я использую geocoder gem для поиска ближайшего местоположения. Однако, как мы можем сделать это только через city без широты и lon, присутствующих в БД для пользователя?

 user = User.last    
user.address = 'Sydney'
location = Geocoder.search(user.address).first
lat = location.latitude
lon = location.longitude

within_user = SpreeUser.near([lat, lon], 200, units: :km)
  

Это выдаст ошибку, потому что широта и долгота не существуют для пользователя. Есть ли способ, которым это можно сделать через другое поле, например, адрес в данном случае?

Комментарии:

1. Geocoder возвращает latitude и longitude для данного адреса. Я не уверен, понял ли я вопрос.

Ответ №1:

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

В вашей модели:

  • Добавьте столбцы latitude и longitude в свою модель.
  • Скажите geocoder, как метод геокодирования: geocoded_by :address
  • Добавьте обратный вызов: after_validation :geocode

Ответ №2:

Как упоминалось в вашем вопросе, у вас уже есть поле с именем ‘city’ в таблице User.

(ссылка:https://github.com/alexreisner/geocoder#geocoding-objects)

Попробуйте это:

 SpreeUser.near('Austin', 200, units: :km)      # users within 200 kms of Austin city