代码之家  ›  专栏  ›  技术社区  ›  frankodwyer

如何阻止rails在SQL中为特定列转义值?

  •  0
  • frankodwyer  · 技术社区  · 17 年前

    我正在尝试手动管理rails模型中的一些几何体(空间)列。

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

    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适配器,spatial适配器对我来说似乎太麻烦了,而且我不需要所有的功能——因此尝试直接使用它)。

    2 回复  |  直到 17 年前
        1
  •  1
  •   ndp    17 年前
    1. 您可以使用after_save方法,通过直接SQL更新调用编写它们。很烦人,但应该有用。

    2. 您应该能够使用“execute”方法在DB迁移中创建触发器。。。但我从未试过。

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

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

        2
  •  1
  •   ehabkost    17 年前

    这个 Rails Spatial Adapter 应该完全实现您所需要的。虽然,在我找到乔治比之前;Spatial Adapter,我正在这样做:

    • 在模型上有两个字段:一个文本字段和一个真实几何体字段
    • after_save

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

    MysqlAdapter#quote