将 SQL 用于轨道参数/值



假设我有一个非常简单的表格,它只有一个用户可以更新的几何列(点):

CREATE TABLE m_point (
id int(11) NOT NULL AUTO_INCREMENT,
point geometry NOT NULL,
deleted_at datetime DEFAULT NULL,
created_at datetime DEFAULT NULL,
updated_at datetime DEFAULT NULL,
PRIMARY KEY (id) )

如何使用导轨插入其中,因为几何列需要实际几何形状?

我本以为这会起作用:

loc = MPoint.new
loc.point = "POINT(#{params[:x]},#{params[:y]})"
loc.save!

但我收到错误:

Mysql2::Error: Cannot get geometry object from data you send to the GEOMETRY field: INSERT INTO `m_point` (`point`) VALUES ('POINT(35, 10)')

因为 POINT(X,Y) 被视为轨道,因为它是一个字符串。我如何获得它,以便 rails 接受 POINT(#{params[:x]},#{params[:y]}) 作为不带引号的命令?

是的,做一个 INSERT 很简单,但我想知道除了安装 gem 之外,是否有任何其他方法可以让它与导轨一起使用。

一种方法是在 MPoint 模型中包含 point 属性的 setter,然后执行手动 SQL 来更新列。

例如。

def set_point(x, y)
   connection.execute("UPDATE m_point SET point = POINT(#{x}, #{y}) WHERE ID = #{self.id}")
end

您可以通过在模型的after_save回调中调用它来进一步改进它,并使用模型中的虚拟属性在set_point方法中使用。

我不希望它适用于vanilla Rails。如果我没记错的话,几何类型特定于 MySQL,并且仅适用于启用的空间扩展。

你可以看看 activerecord-mysql2spatial-adapter

最新更新