Как мне остановить рельсы от экранирования значений в SQL для определенного столбца? - PullRequest
0 голосов
/ 27 августа 2009

Я пытаюсь вручную управлять некоторыми геометрическими (пространственными) столбцами в модели рельсов.

При обновлении столбца геометрии я делаю это в рельсах:

self.geom="POINTFROMTEXT('POINT(#{lat},#{lng})')"

Какое значение я хочу использовать в обновлениях SQL, чтобы оно оценивалось базой данных. Однако к тому времени, когда это прошло через активную магию записи, оно выглядит как:

INSERT INTO `places` (..., `geom`) VALUES(...,'POINTFROMTEXT(\'POINT(52.2531519,20.9778386)\')')

Другими словами, кавычки экранированы. Это хорошо для других столбцов, поскольку предотвращает sql-инъекцию, но не для этого. Значения гарантированно являются плавающими, и я хочу, чтобы обновление выглядело так:

INSERT INTO `places` (..., `geom`) VALUES(...,'POINTFROMTEXT('POINT(52.2531519,20.9778386)')')

Так есть ли способ отключить экранирование для определенного столбца? Или лучший способ сделать это?

(Я пытался использовать GeoRuby + пространственный адаптер, и пространственный адаптер мне кажется слишком глючным, плюс мне не нужны все функции - следовательно, я пытаюсь сделать это напрямую).

Ответы [ 2 ]

1 голос
/ 13 сентября 2009

Пространственный адаптер Rails должен реализовывать именно то, что вам нужно. Хотя, прежде чем я нашел GeoRuby & Spatial Adapter, я делал это:

  • В модели есть два поля: одно текстовое поле и поле реальной геометрии
  • На after_save крюке я запустил что-то вроде этого:

    connection.execute "update mytable set geom_column = # {text_column}, где id = # {id}"

Но вышеприведенное решение было просто взломом, и у него есть дополнительные проблемы: я не могу создать пространственный индекс, если столбец допускает значения NULL, MySQL не позволяет мне устанавливать значение по умолчанию для столбца геометрии, и метод save завершается ошибкой, если для столбца геометрии не установлено значение.

Поэтому я бы вместо этого попробовал GeoRuby & Spatial Adapter или повторно использовал часть его кода (в моем случае я рассматриваю возможность извлечения только метода MysqlAdapter#quote с учетом ГИС из кода Spatial Adapter).

1 голос
/ 27 августа 2009
  1. Вы можете использовать метод after_save, писать их с помощью прямого вызова SQL UPDATE. Раздражает, но должно работать.

  2. Вы должны быть в состоянии создать триггер в миграции вашей БД, используя метод execute ... но я никогда не пробовал.

  3. Изучите функциональность вычислений ActiveRecord: max / min / avg и т. Д. Не уверен, что это сильно сэкономит вас при прямом вызове SQL в after_save. См. Расчеты.рб.

  4. Вы можете исправить функцию, которая заключает в кавычки атрибуты (ищет POINTFROMTEXT, а затем пропустить цитирование). Это довольно легко найти, так как все методы начинаются с кавычек. Начните с ActiveRecord :: Base #quote_value.

...