我正在尝试手动管理 Rails 模型中的一些几何(空间)列。
更新几何列时,我在 rails 中执行此操作:
self.geom="POINTFROMTEXT('POINT(#{lat},#{lng})')"
这是我希望在 SQL 更新中的值,以便由数据库评估。然而,当这已经通过事件记录魔法时,结果如下:
INSERT INTO `places` (..., `geom`) VALUES(...,'POINTFROMTEXT(\'POINT(52.2531519,20.9778386)\')')
换句话说,引号被转义了。这对其他列很好,因为它可以防止 sql 注入(inject),但不适用于此。这些值保证是 float ,我希望更新看起来像:
INSERT INTO `places` (..., `geom`) VALUES(...,'POINTFROMTEXT('POINT(52.2531519,20.9778386)')')
那么有没有办法关闭特定列的转义?或者更好的方法?
(我试过使用 GeoRuby+空间适配器,但空间适配器对我来说似乎太麻烦了,而且我不需要所有功能 - 因此我尝试直接使用)。
最佳答案
Rails Spatial Adapter应该准确地实现你所需要的。虽然,在我找到 GeoRuby & Spatial Adapter 之前,我是这样做的:
- 在模型上有两个字段:一个文本字段和一个真实的几何字段
在
after_save
Hook 上,我运行了如下内容:connection.execute "update mytable set geom_column=#{text_column} where id=#{id}"
但上面的解决方案只是一个 hack,还有其他问题:如果列允许 NULL
值,我无法创建空间索引,MySQL 不允许我设置默认值在几何列上,如果几何列没有设置值,save
方法将失败。
所以我会尝试 GeoRuby & Spatial Adapter,或者重用它的一些代码(在我的例子中,我正在考虑从 Spatial Adapter 代码中只提取 GIS-aware MysqlAdapter#quote
方法) .
关于mysql - 如何阻止 Rails 转义 SQL 中特定列的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1338492/