3

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

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 之外,是否还有其他方法可以让它与 rails 一起使用。

4

2 回答 2

1

一种方法是在 MPoint 模型中包含点属性的设置器,然后执行手动 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 方法中使用。

于 2012-11-30T02:58:23.710 回答
0

我不希望这适用于香草 Rails。如果我没记错的话,GEOMETRY 类型是特定于 MySQL 的,并且仅适用于启用空间扩展。

你可以看看activerecord-mysql2spatial-adapter

于 2012-11-30T02:59:58.377 回答