#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