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(众所周知的文本)格式中纬度 -26 和经度 -43 的点。我希望能够隐藏此实现细节并使其可以编写:

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

也许我可以通过覆盖我的设备类中的 after_initialize 方法来实现这一点。我还可以做些什么?

还有一件事..我还需要以 JSON 格式输出这个对象。现在我得到

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

但是,我想要类似的东西

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

对此的快速解决方案是覆盖 as_json 方法。还有其他建议吗?

谢谢。

4

1 回答 1

1

您需要做的就是在Device类中覆盖方法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 回答