2012-09-29 113 views
2

我正在使用PostgreSQL + PostGIS來處理空間數據,並且我還使用這個gem activerecord-postgis-adapter來保持編寫代碼的容易性。我有這個模型Ruby on Rails + PostGIS模型自定義初始化和自定義JSON輸出

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

其中:位置應該是PostGIS POINT。創建設備的新實例(在控制器的製作方法,例如),我可以這樣做:

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

其中「POINT(-26 -43)」是緯度-26和經度-43中的點WKT(知名文本)格式。我想能夠隱藏此實現細節,使人們有可能寫:

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

也許我可以在我的設備類中重寫after_initialize方法實現這一目標。我還可以做些什麼?

還有一件事..我也需要用JSON輸出這個對象。現在,我得到

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

不過,我想有一些像

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

快速N」骯髒的解決方案,這將是覆蓋as_json方法。還有其他建議嗎?

謝謝。

+1

座標軸順序爲POINT(X Y),因此POINT(經度緯度)。你需要翻轉這些。 –

+0

@MikeToews好吧,我知道,但這不是問題。 – xissburg

回答

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)\" }