2

私は PostgreSQL + PostGIS を使用して空間データを操作しています。また、この gem activerecord-postgis-adapterを使用して、コードを簡単に記述できるようにしています。私はこのモデルを持っています

class Device < ActiveRecord::Base
  attr_accessible :location
  self.rgeo_factory_generator = RGeo::Geos.factory_generator
end

:location は PostGIS POINT である必要があります。Device の新しいインスタンスを作成するには (たとえば、コントローラーの create メソッドで)、次のようにします。

params = { location: "POINT (-26 -43)" }
@device = Device.new(params)

ここで、「POINT (-26 -43)」は WKT (Well Known Text) 形式の緯度 -26 経度 -43 のポイントです。この実装の詳細を非表示にして、次のように記述できるようにしたいと考えています。

params = { latitude: -26, longitude: -43 }
@device = Device.new(params)

おそらく、Device クラスの after_initialize メソッドをオーバーライドすることで、これを実現できます。他に何ができますか?

もう 1 つあり、このオブジェクトを JSON で出力する必要もあります。今私は得る

{ "location": "POINT (-26 -43)" }

しかし、私は次のようなものが欲しい

{ "location": { "latitude": -26, "longitude": -43 } }

これに対する簡単で汚い解決策は、as_json メソッドをオーバーライドすることです。他の提案はありますか?

ありがとう。

4

1 に答える 1

1

あなたがする必要があるのは、デバイスクラスでメソッドas_jsonを上書きして、ロケーションキーを必要なものに置き換えることだけです:

class Device < ActiveRecord::Base
  ...
  def as_json(options = {})
    json = super(options)
    json.merge(location_as_formatted_hash)
  end

  private

  def location_as_formatted_hash
    { location: { latitude: location.lat, longitude: location.lon } }
  end
end

これで、次のことができます。

Device.first.to_json
{ \"location\": { \"latitude\": -26, \"longitude\": -43 } }

これの代わりに:

Device.first.to_json
{ \"location\": \"POINT (-26 -43)\" }
于 2016-05-31T21:31:13.167 に答える