2012-01-09 19 views
2

我有了兩個字段地點模型:如何在Mongoid&Rails中使用數組字段?

class Place 
    include Mongoid::Document 

    field :name, :type => String 
    field :loc, :type => Array 

    index([[:loc, Mongo::GEO2D]], :background => true) 

    validates_presence_of :name 
end 

我可以輕鬆地輸出緯度和經度在我的觀點:

@place.loc['lat'] 

MongoDB中表示每個地方的記錄是這樣的:

{ "_id" : ObjectId("0293uhjf2hfio2h3"), 
    "name" : "Starbucks", 
    "loc" : { 
    "lat" : 44.106667, 
    "lon" : -73.935833 
    } 
} 

我的問題是我怎麼可以創建一個表單,讓我來編輯或創建新的位置(經/緯度)字段?

+1

就像任何其他形式。有問題嗎? – 2012-01-09 23:32:00

+0

如果我創建一個名稱爲[loc] [lat]的輸入字段,則控制器的更新操作會返回一個錯誤:「字段被定義爲(n)數組,但接收到值爲」的ActiveSupport :: HashWithIndifferentAccess。如果我將loc的數據類型更改爲Hash,那麼即使我嘗試更改名稱字段,也不會有任何反應。不過,控制器確實表示該地點已成功更新,儘管事實並非如此。 – Vasily 2012-01-10 18:14:03

+0

挖掘更長時間後,我發現update_attributes並不真正更新屬性,即使有新的屬性。如果我手動更改值並調用place.save,它可以工作。但這是一個非常糟糕的解決方案...所以,我會繼續尋找。 – Vasily 2012-01-10 19:01:08

回答

1

我找到了解決方案。我沒有在場所模型中設置字段,而是創建了另一個名爲「loc」的模型,並在其中添加了「embeds_one:loc」。所以地點模型現在看起來是這樣的:

class Place 
    include Mongoid::Document 
    field :name 

    index([[:loc, Mongo::GEO2D]], :background => true) 

    embeds_one :loc 
    validates_presence_of :name 
end 

而且祿模型現在看起來是這樣的:

class Loc 
    include Mongoid::Document 

    field :lat, :type => Integer 
    field :lon, :type => Integer 

    embedded_in :place 
end 

所以,現在我可以有輸入框在我的形式位置:

<input type="text" name="place[loc][lat]" id="place_loc_lat"> 
相關問題