2011-03-06 89 views
2

我想要做以下事情。我可以保存爲Model的屬性作爲散列嗎?

我希望我的模型有一個存儲哈希的列,即名稱/值對。 當我在我的模型中加載一條記錄時,我不希望它解析去除數據庫中的值,除非我訪問它,即延遲初始化。

這是B/C只有幾分之一的數據庫中的行將有散列值,並且它們很少被訪問。

這可能嗎?

用法示例:

user.properties["age"] = 12 

user.properties["height"] = xxx 

user.save 

我不知道它是如何被保存到數據庫,也許在JSON格式?

+0

這不是什麼[哈希(http://en.wikipedia.org/wiki/ Hash_function)表示 – 2011-03-06 20:20:14

回答

5

是的,你可以序列化數據。

摘錄自http://api.rubyonrails.org/classes/ActiveRecord/Base.html

class User < ActiveRecord::Base 
    serialize :preferences 
end 

user = User.create(:preferences => { "background" => "black", "display" => large }) 
User.find(user.id).preferences # => { "background" => "black", "display" => large } 
+0

謝謝,我更新了我的答案。 – vise 2011-03-06 20:42:01

+0

但是這個屬性在每次加載對象時都會被反序列化?我希望它懶惰反序列化,即只有當訪問 – Blankman 2011-03-07 16:30:40

1

ActiveRecord::Base#serialize不只是這一點。

class User < ActiveRecord::Base 
    serialize :preferences, Hash 
end 

user = User.create(:preferences => { "background" => "black", "display" => large }) 
User.find(user.id).preferences # => { "background" => "black", "display" => large } 
User.find(user.id).preferences[:background] # => "black" 
+1

我站在糾正,因爲我貼錯了摘錄,但你應該在評論中提到。在發佈一個鏈接之後,然後用好的摘錄編輯你的帖子,並強調我的錯誤在你的回答中,我不禁會發現最近的新編輯沒有得到保存過程的不公平。 – vise 2011-03-06 20:40:02

+0

好點。對你幾乎正確的答案發表評論會更機靈。對不起,這不是理由,但我還是新來的StackOverflow和學習繩索。我只是想幫助同胞Rubyists。 – Unixmonkey 2011-03-06 21:31:31

0

您可以使用字符串作爲數據類型,並將其保存爲yaml格式的散列。你需要加載這個yaml字符串,但恕我直言,給你更多的便攜性。

hash = {a => b, c=>d} 
object.properties = hash.to_yaml 
. 
. 
. 
hash = Yaml::load(object.properties) 
相關問題