Обработка широтных / длинных и mysql пространственных точек в рельсах - PullRequest
2 голосов
/ 21 июля 2009

Было довольно много вопросов о типах пространственных данных mysql, однако мой более конкретно описывает, как лучше иметь дело с ними в архитектуре rails MVC.

У меня есть форма ввода, где администратор может создать новую достопримечательность, скажем, ресторан и ввести некоторую информацию. Они также могут вводить удобочитаемую широту и долготу в десятичном формате.

Однако для расчета расстояния и т. Д. Я храню данные о местоположении в качестве пространственной точки в базе данных.

Поэтому мой вопрос, как лучше всего справиться с этим в архитектуре MVC в рельсах?

Вот несколько идей, которые у меня были, но ничто не кажется чистым:

  • Вызов: метод after_filter, который принимает новый экземпляр объекта и выполняет необработанное обновление SQL, которое обрабатывает доброту "GeomFromText ('POINT (lat long)'))". Проблема в том, что "lat / long" будет текстовыми полями в моей форме создания, хотя это нарушает чистую архитектуру form_for: object, которую предоставляет rails, поскольку lat / long на самом деле не являются атрибутами, они просто позволяют человеческие входные значения, которые не являются MySQL пространственными.

  • Может быть, создать триггер в БД для запуска после вставки строки, которая обновляет эту строку? Я понятия не имею, и не похоже, чтобы эти триггеры имели доступ к широте / долготе, если только я не сохранил широту и долготу, а также пространственную точку, а затем создал строку в БД с десятичными числами широты и долготы. , а затем запустил триггер после создания, чтобы обновить пространственный. Я думаю, что я мог бы также сделать это с after_filter, если бы я добавил столбцы lat / long в модель.

Есть еще идеи? Я думаю, что сохранение широты / долготы является излишним, поскольку я действительно буду использовать пространственную точку для вычисления расстояния и т. Д., Но это может быть необходимо, если я разрешу редактирование человеком.

Ответы [ 2 ]

3 голосов
/ 22 июля 2009

Извлеките плагин geokit-rails для Rails , который выполняет расчеты расстояния, используя простые столбцы lat / lng в качестве поплавков (и использует гем geokit ). Однако, если вы хотите использовать геопространственные возможности вашей базы данных, GeoRuby поддерживает базовые пространственные объекты, такие как Point или LineString, в качестве типов столбцов. Я надеюсь, что это поможет.

0 голосов
/ 22 июля 2009

Я согласен с безнадежным, геокит это хорошо, я тоже им пользуюсь.

Если вы хотите сделать это самостоятельно, я бы сделал after_filter, но перенес бы метод обновления в поток. Как будто у вас нет замедления при сохранении, но все равно хороший код и своевременно обновляемые столбцы.

Триггеры не хороши, база данных должна доставлять данные, но не выполнять логику.

...