2013-06-11 48 views
3

我用hstore在Postgres 9.2和Rails 3.2存儲這樣我的對象:轉換字符串化的陣列回到陣

class User 
    user_hstore = {:user_id =>"123", :user_courses => [1,2,3]} 
end 

現在,當我找回user_courses,我得到一個字符串是這樣的: '[1, 2, 3]'

如何將此字符串轉換爲Rails數組?更好的是,有沒有辦法在hstore對象中存儲數組,以便Rails能夠自動將其作爲數組類型檢索?

+0

儘管我之前的回答是,Postgres不支持超出字符串值的任何內容。我懷疑'serialize'和hstore之間的重疊功能,現在還沒有一個現成的解決方案。 –

+1

該團隊正致力於改進PostgreSQL 9.4的這一功能,希望能夠爲hstore提供完全可索引的,可嵌套的,json兼容的替代品。參見http://lwn.net/Articles/553256(目前僅限訂閱者,下個星期某個時候可以閱讀)。 –

+0

嗨克雷格:感謝您的信息。愚蠢的問題:Rails需要支持這個功能之前,我們可以使用它,對嗎? – AdamNYC

回答

1

要將其轉換爲數組:

user_courses.gsub('[', '').gsub(']', '').split(",") 

爲了使檢索更爲簡單,你可以將其存儲爲一個字符串做

user_hstore = {:user_id =>"123", :user_courses => '1,2,3'} 
1

只是拋出另一個帽子成環,這個完成與Vimsha的回答一樣,但是可以做得更短,更甜美:

"[1,2,3,4]"[1..-2].split(",") 

哪個在喲烏爾情況可能是:

user_courses[1..-2].split(",") 

編輯: 如果速度是一個問題我做了一個快速基準可以發現here。只做一些項目不是很大的差異,但是有10,000個項目+你可以開始看到不同之處。這是100,000件物品:

# "[1,2,3,4]"[1..-2].split(",") 
    0.110000 0.000000 0.110000 ( 0.114739) 

    # "[1,2,3,4]".gsub("[", "").gsub("", "]").split(",") 
    1.080000 0.000000 1.080000 ( 1.081227) 
6

爲什麼不只是使用eval

eval('[1, 2, 3]') 
#=> [1, 2, 3] 

顯然,不這樣做的隨意性或者用戶輸入的數據,但整數數組爲你顯示,這是完全安全的。

7
JSON.parse "[\"1018\", \"1037\", \"1045\", \"1042\"]" 
#=> ["1018", " 1037", " 1045", " 1042"]