Длина строки в метрах с рельсами - неверная геометрия СОВЕТ - PullRequest
0 голосов
/ 19 мая 2018

Я пытаюсь найти длину строки в метрах

В моем шоу контроллера:

def show
  @track = Track.friendly.find(params[:id])
  @track_length = Track.find_by_sql ["SELECT ST_Length('path') FROM tracks WHERE id = ?", @track.id]
end

Мой вид шоу:

<p>Track id : <%= @track.id%></p>
<p>Longueur : <%= @track_length %></p>
<p>Linestring : <%= @track.path %></p>

Возврат:

PG :: InternalError: ERROR: ошибка синтаксического анализа - неверная геометрия HINT: "pa" <- ошибка синтаксического анализа в позиции 2 в геометрии CONTEXT: оператор SQL "выражение st_length"1: ВЫБРАТЬ ST_Length ('путь') ИЗ дорожек, ГДЕ id = 1 Что не так? </p>

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Я бы решил это немного по-другому.В вашем классе Track добавьте метод следующим образом:

class Track 

  def length 
    @length ||= calculate_length 
  end 

  def calculate_length 
    length_sql = <<-SQL 
      select st_length(path) as length from tracks where id=#{self.id}
    SQL
    Track.connection.execute(length_sql).first["length"]
  end   
end

Поэтому мы запоминаем длину (запомним это).Если @length не установлено, мы вычисляем длину, в противном случае мы просто возвращаем ранее вычисленное значение.

И тогда, на ваш взгляд, вы можете просто сделать что-то вроде

<p>Track id : <%= @track.id%></p>
<p>Longueur : <%= '%.02f' % @track.length %>m</p>
<p>Longueur : <%= '%.02f' % (@track.length/1000) %>km</p>
0 голосов
/ 21 мая 2018

Я нашел ответ:

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

@track_length = Track.find_by_sql(["SELECT (ST_Length(path::geography)/1000)  AS length FROM tracks WHERE id = ?", @track.id])

В шоу:

<p>Longueur : <%= number_with_precision(@track_length.first.length, precision: 2) %> kilomètres</p>

Может быть, есть лучшее решение, но оно работает;)

...