2012-11-30 54 views
3

比方說,我有一個非常簡單的表,只是有一個幾何列(點),用戶可以更新:的軌道參數使用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)') 

爲(X,Y)被視爲軌道作爲一個字符串的位置。我如何得到它,以便rails接受POINT(#{params [:x]},#{params [:y]})作爲不帶引號的命令?

是的,做一個INSERT會很簡單,但我想知道是否有其他方法,缺少安裝gem,以使其與rails一起工作。

回答

1

做到這一點的一種方法是在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方法使用。

+0

我正在考慮只是做了初始插件後的更新,但失敗的嘗試做它在軌道的目的。此外,將不得不放置一個虛擬值作爲位置不爲空。 –

+0

如果你需要NOT NULL,那麼就不能這樣做。如提到的zetetic將不得不尋找一個寶石。 –

0

我不希望這與香草Rails工作。如果我記得正確,那麼GEOMETRY類型是特定於MySQL的,只能在啓用空間擴展的情況下使用。

你可能看activerecord-mysql2spatial-adapter