【发布时间】:2009-08-27 02:01:29
【问题描述】:
我正在尝试手动管理 rails 模型中的一些几何(空间)列。
更新几何列时,我在 rails 中执行此操作:
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+空间适配器,空间适配器对我来说似乎太麻烦了,而且我不需要所有功能 - 因此尝试直接使用)。
【问题讨论】:
-
我不太确定这里有什么问题。如果这些引号没有被转义,你会因为不正确的引号引起 SQL 错误。如果您检索保存的数据,则不应出现转义字符
-
关于错误关闭的引号的好点。但是,我从不需要检索这个值——它只用于空间索引。我试图得到这样的等价物: UPDATE places set geom=POINTFROMTEXT('POINT(52,253,20.977')
-
另一种看待它的方式是,每当更新 lat、lng 列时,我都想更新 geom。在我的 geom 迁移中,我在添加列后执行以下操作:执行“UPDATE
#{table}set geom=POINTFROMTEXT(CONCAT('POINT(',lat,'',lng,')'))”。我想在 lat 或 lng 更改时触发类似的更新 - 无论是在 DB 触发器中还是通过 rails。我目前正在使用 before_save 回调,这导致了上述问题。而且我不知道如何在迁移中定义数据库触发器。
标签: mysql ruby-on-rails geometry escaping geospatial