1

我正在尝试手动管理 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+spatial 适配器,空间适配器对我来说似乎太麻烦了,而且我不需要所有的功能——因此试图直接做)。

4

2 回答 2

1
  1. 您可以使用 after_save 方法,通过直接 SQL UPDATE 调用来编写它们。烦人,但应该工作。

  2. 您应该能够使用“执行”方法在数据库迁移中创建触发器......但我从未尝试过。

  3. 深入研究 ActiveRecord 的计算功能:max/min/avg 等。不确定这是否比 after_save 中的直接 SQL 调用节省了很多。见计算.rb。

  4. 您可以修补引用属性的函数(查找 POINTFROMTEXT 然后跳过引用)。这很容易找到,因为所有方法都以引号开头。从 ActiveRecord::Base #quote_value 开始。

于 2009-08-27T07:42:16.040 回答
1

Rails 空间适配器应该完全实现您所需要的。虽然,在我找到 GeoRuby & Spatial Adapter 之前,我是这样做的:

  • 在模型上有两个字段:一个文本字段和一个真实几何字段
  • 在一个after_save钩子上,我跑了这样的事情:

    connection.execute "更新 mytable 设置 geom_column=#{text_column} where id=#{id}"

但是上面的解决方案只是一个 hack,这还有其他问题:如果列允许值,我无法创建空间索引NULL,MySQL 不允许我在几何列上设置默认值,save如果几何列没有设置值。

所以我会尝试使用 GeoRuby & Spatial Adapter,或者重用它的一些代码(就我而言,我正在考虑MysqlAdapter#quote从 Spatial Adapter 代码中仅提取 GIS 感知方法)。

于 2009-09-12T21:02:31.350 回答