对rails参数/值使用SQL

对rails参数/值使用SQL,sql,ruby-on-rails,Sql,Ruby On Rails,假设我有一个非常简单的表,它只有一个几何列(点),用户可以更新: 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) ) 由于“几何体”列需要实

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

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) )
由于“几何体”列需要实际的几何体,如何使用rails将其插入

我本以为这会奏效:

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)')
因为点(X,Y)被视为是一个字符串。如何使rails接受POINT(#{params[:x]},#{params[:y]})作为无引号的命令


是的,插入
很简单,但我想知道除了安装gem之外,是否还有其他方法可以让它与rails一起工作。

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

例如


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

我不认为这适用于vanilla Rails。如果我没记错的话,GEOMETRY类型是MySQL特有的,并且只在启用了空间扩展的情况下工作


您可能会看到

我正在考虑在初始插入之后进行更新,但这与尝试在rails中进行更新的目的背道而驰。此外,还必须输入一个伪值,因为位置不为NULL。如果需要不为NULL,则不能这样做。正如齐蒂提所说,我们必须研究一颗宝石。
def set_point(x, y)
   connection.execute("UPDATE m_point SET point = POINT(#{x}, #{y}) WHERE ID = #{self.id}")
end