[英]How do I stop rails from escaping values in SQL for a particular column?
我正在尝试手动管理Rails模型中的某些几何(空间)列。
更新几何列时,我在rails中这样做:
self.geom="POINTFROMTEXT('POINT(#{lat},#{lng})')"
这是我想要在SQL更新中被数据库评估的值。 但是,在通过主动录制魔术的时候,结果如下:
INSERT INTO `places` (..., `geom`) VALUES(...,'POINTFROMTEXT(\'POINT(52.2531519,20.9778386)\')')
换句话说,引号被转义了。 这对于其他列也很好,因为它可以防止sql-injection,但是不能这样做。 这些值保证为浮点型,我希望更新如下所示:
INSERT INTO `places` (..., `geom`) VALUES(...,'POINTFROMTEXT('POINT(52.2531519,20.9778386)')')
那么有没有办法关闭特定列的转义? 还是更好的方法呢?
(我已经尝试过使用GeoRuby + spatial适配器,而对我来说,spatial适配器似乎过于麻烦,而且我不需要所有功能-因此尝试直接进行操作)。
您可以使用after_save方法,并通过直接的SQL UPDATE调用编写它们。 烦人,但应该可以。
您应该能够使用'execute'方法在数据库迁移中创建触发器...但是我从未尝试过。
挖掘ActiveRecord的计算功能:max / min / avg等。不确定after_save中的直接SQL调用是否能为您节省很多时间。 参见calculations.rb。
您可以修补引用属性的函数(查找POINTFROMTEXT,然后跳过引用)。 这很容易找到,因为所有方法都以引号开头。 以ActiveRecord :: Base #quote_value开头。
Rails空间适配器应该完全实现您所需要的。 虽然,在我找到GeoRuby&Spatial Adapter之前,我是这样做的:
在after_save
钩子上,我运行了以下内容:
connection.execute“更新mytable集geom_column =#{text_column},其中id =#{id}”
但是上面的解决方案只是一个hack,这还有其他问题:如果该列允许使用NULL
值,那么我将无法创建空间索引; MySQL不允许我在geometry列上设置默认值,并且save
方法失败如果几何列未设置值。
因此,我将改为尝试使用GeoRuby和Spatial Adapter,或重用其某些代码(就我而言,我考虑从Spatial Adapter代码中仅提取可识别GIS的MysqlAdapter#quote
方法)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.