2013-02-21 21 views
4

在Mongoid 3.0.21中,如何獲取所有模型的屬性爲普通的Ruby Hash在Ruby hash中提取`Moped :: BSON :: Document`屬性

調用#attributes#raw_attributes返回Moped::BSON::Document。雖然它實際上延伸Hash幾個散列方法不能按預期工作。特別是#except返回未修改self,而不是散列與剝去給定的鍵。

更新Moped::BSON::Document正確地繼承了Hash的行爲。我試圖用符號命名屬性,而不是字符串,這就是爲什麼#except不起作用。馬上:做except('pictures'),而不是except(:pictures)

回答

11
Hash[e.attributes] 

其中e爲模型的實例

+0

謝謝!我知道必須有這樣的優雅解決方案! – skalee 2013-02-21 16:07:14

+0

你可能想使用ActiveSupport :: HashWithIndifferentAccess而不是普通的散列來使用字符串和符號來訪問值 – cthulhu 2013-02-21 16:39:49

+0

我當然可以,謝謝。但主要問題是我根本無法訪問屬性名稱,因爲它們是用字符串索引的,而不是符號。這與我習慣的(ActiveRecord)不同。 – skalee 2013-02-22 17:52:30

4

我對撞這麼老的東西道歉,但我想在這裏把這個留給自己和所有誰遇到同樣的問題未來的人。我正在使用Mongoid ORM for Rails,它在內部使用Moped與MongoDB進行交互。

這顆寶石現在已經節省了我幾個小時的手動轉換東西到HashHashWithIndifferentAccesshttps://github.com/mindscratch/mongoid-indifferent-access

本質上它似乎有某種預迴歸掛鉤,它會自動將所有來自MongoDB的文檔轉換爲HashWithIndifferentAccess

不尋找這方面的觀點。只是想在這裏留下,因爲這是谷歌對這個問題的最好結果,它使我免於瘋狂。