Отделение местоположения от пользователей и геокодера Rails

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

Однако это привело к интересной проблеме: при попытке найти пользователей рядом с определенным местом мы теперь немного облажались. Когда широта/долгота связаны с пользователем, вы можете просто выполнить User.near(@geocoded_record) и получить отсортированный по расстоянию список пользователей. Когда местоположение является независимым, становится все труднее, и я ищу совета о том, как правильно запросить это.

Я пробовал User.some_scopes.joins(:location).merge(Location.near(@geocoded_record)), но это возвращает ActiveRecord_Relation с записями пользователя, которые содержат только нулевой идентификатор, широту и долготу... Этого НЕ происходит, когда по какой-то причине применяется какой-либо другой вид области/запроса к слиянию местоположения.

Итак ... У кого-нибудь есть предложение о том, как лучше всего получать записи пользователей, отсортированные по расстоянию, в геокодированную запись через ассоциацию, не возвращаясь к широте/долготе непосредственно для пользователя?


person Brad Herman    schedule 09.02.2021    source источник


Ответы (2)


joins и near с Geocoder дают неожиданные результаты.

Мы столкнулись с той же проблемой и создали область, и, похоже, она отлично работает для нас.

https://github.com/alexreisner/geocoder/issues/627

dkniffin предоставляет указанные ниже области.

person dtakeshta    schedule 09.02.2021
comment
На самом деле это то, с чем я в конечном итоге тоже пошел... Я думаю, что я мог бы изменить что-то вроде этого: ``` class LocationUpdate include Interactor def call context.location.update(params) context.location.user. update_columns(params) end end ``` Таким образом, я все еще могу просто искать пользователей по местоположению, не нарушая кеши сериализации, но могу продолжать обновлять/обслуживать данные о местоположении независимо. - person Brad Herman; 11.02.2021

Недавно у меня была такая же проблема, в моем случае у меня есть модель Travel и модель Destination, которая содержит значения широты и долготы для путешествия. Наконец-то я заработал так, вероятно, не лучший с точки зрения оптимизации:

Сфера путешествий:

scope :near_of, ->(target_lat, target_lng) { joins(:destination).merge(Destination.near([target_lat, target_lng], 3)) }

И контроллер:

travels = Travel.includes(:destination).near_of(params[:destination_latitude], params[:destination_longitude])
person Ernesto G    schedule 10.02.2021
comment
Довольно близко к тому, с чем я пошел... В конце концов я продолжил устанавливать широту/долготу для объекта пользователя также через update_columns, чтобы я не разорвал кеш, а мог просто запросить напрямую - person Brad Herman; 11.02.2021