Сохранение рассчитанного столбца для использования в order_by и выбор - PullRequest
1 голос
/ 13 июня 2019

Итак, я делаю расчет PostGis.У меня есть модель User и Place.Каждый из них имеет :geom, а Place имеет виртуальное поле distance.Я хочу заказать по расстоянию, а также выбрать его.У меня это работает так, но я боюсь, что это делает postgis calc дважды.Есть ли лучший способ сделать это?

from(
  ...,
  order_by: [asc: st_distance(u.geom, p.geom)], 
  select: %{p | distance: st_distance(u.geom, p.geom)}
)

1 Ответ

2 голосов
/ 13 июня 2019

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

В вашем случае это выглядело бы примерно так:

from(
  ...,
  order_by: [asc: fragment("distance")], 
  select: %{p | distance: fragment("? AS distance", st_distance(u.geom, p.geom))}
)
...