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 をインストールする以外に、これをレールで動作させる方法があるかどうか疑問に思っています。

4

2 に答える 2

1

これを行う 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 に答える