Как сделать выборочный запрос сравнительно быстрее в рельсах? - PullRequest
0 голосов
/ 12 ноября 2018

Я искал лучший подход, чтобы быстрее получить этот запрос в рельсах. В настоящее время это занимает много времени из-за вычислений геокодера.

Vehicle.includes(:user)
       .where.not('users.id' => nil)
       .where(country: 'United Kingdom')
       .where.not(name: [nil, ''])
       .select { |vehicle| 
         vehicle.longitude.present? &&
         Geocoder::Calculations.distance_between(
           [vehicle.latitude,vehicle.longitude], 
           [location.latitude,location.longitude]
         ).between?(0, 200)
       }

Примечание. В настоящее время используется база данных PostgreSQL 9.5.14.

1 Ответ

0 голосов
/ 12 ноября 2018
  1. Переместить vehicle.longitude.present? на уровень базы данных:

    .where.not(longitude: [nil, ''])
    
  2. Ваш расчет расстояния должен быть перенесен на уровень базы данных. Загрузка всех записей и вычисление расстояния для каждой из них в Ruby будут слишком медленными. Самое простое решение - добавить PostGIS:

    1. Добавьте расширение PostGIS в вашу базу данных.
    2. (Необязательно) добавьте адаптер , который облегчит работу с данными.
    3. Перенесите ваши существующие широты / долготы в st_point.
    4. Измените ваш выбор на область, которая будет использовать функцию ST_Distance .
  3. В качестве альтернативы 2), вы можете рассмотреть вопрос о переносе ваших дистанционных запросов в поисковик, такой как ElasticSearch. Я бы только учел это, если у вас возникнут проблемы с производительностью сложного запроса, который вы создаете.

...