Gem Geocoder Place.near кешируется.Как я могу раскэшировать это?(Хочу изменить порядок элементов) - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть следующий запрос благодаря геокодеру gem:

@places = Place.near(coords, radius)

Запрос выглядит в виде SQL:

 Place Load (20.9ms)  SELECT places.*, 3958.755864232 * 2 * ASIN(SQRT(POWER(SIN((41.3828939 - places.latitude) * PI() / 180 / 2), 2) + COS(41.3828939 * PI() / 180) * COS(places.latitude * PI() / 180) * POWER(SIN((2.1774322 - places.longitude) * PI() / 180 / 2), 2))) AS distance, MOD(CAST((ATAN2( ((places.longitude - 2.1774322) / 57.2957795), ((places.latitude - 41.3828939) / 57.2957795)) * 57.2957795) + 360 AS decimal), 360) AS bearing FROM "places" WHERE (places.latitude BETWEEN 41.31052800844458 AND 41.45525979155542 AND places.longitude BETWEEN 2.080984013859067 AND 2.273880386140933 AND (3958.755864232 * 2 * ASIN(SQRT(POWER(SIN((41.3828939 - places.latitude) * PI() / 180 / 2), 2) + COS(41.3828939 * PI() / 180) * COS(places.latitude * PI() / 180) * POWER(SIN((2.1774322 - places.longitude) * PI() / 180 / 2), 2)))) BETWEEN 0.0 AND 5) 
ORDER BY distance ASC

Он упорядочен в конце запросапо расстоянию.Это хорошо, но теперь я хочу отсортировать элементы по алфавиту, поэтому я делаю следующий запрос

@ place = @ place.order (name:: asc)

Но этот запрос возвращается как SQL:

Place Load (1.7ms)  SELECT places.*, 3958.755864232 * 2 * ASIN(SQRT(POWER(SIN((41.3828939 - places.latitude) * PI() / 180 / 2), 2) + COS(41.3828939 * PI() / 180) * COS(places.latitude * PI() / 180) * POWER(SIN((2.1774322 - places.longitude) * PI() / 180 / 2), 2))) AS distance, MOD(CAST((ATAN2( ((places.longitude - 2.1774322) / 57.2957795), ((places.latitude - 41.3828939) / 57.2957795)) * 57.2957795) + 360 AS decimal), 360) AS bearing FROM "places" WHERE (places.latitude BETWEEN 41.31052800844458 AND 41.45525979155542 AND places.longitude BETWEEN 2.080984013859067 AND 2.273880386140933 AND (3958.755864232 * 2 * ASIN(SQRT(POWER(SIN((41.3828939 - places.latitude) * PI() / 180 / 2), 2) + COS(41.3828939 * PI() / 180) * COS(places.latitude * PI() / 180) * POWER(SIN((2.1774322 - places.longitude) * PI() / 180 / 2), 2)))) BETWEEN 0.0 AND 5) 
ORDER BY distance ASC, "places"."name" ASC

До сих пор я пытался сохранить результаты в новой переменной, но затем получаю следующее:

CACHE Place Load (0.1ms)  SELECT places.*, 3958.755864232 * 2 * A etc.

Я вижу, что запрос был кэширован.

Я также прочитал документацию, но они говорят о двигателях, поэтому мне трудно понять.

https://edgeguides.rubyonrails.org/caching_with_rails.html

Может кто-нибудь подсказать мне эту проблему?Я хочу понять, почему, если у меня есть коллекция AR, и я применил метод, почему предыдущий запрос используется снова, а не применяется только к элементам.

Как я могу отсортировать элементы по алфавиту,игнорируя отсортированные по расстоянию?

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

...