假设我有一个非常简单的表格,它只有一个用户可以更新的几何列(点):
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