我想做以下事情。
我希望我的模型有一个存储哈希值的列,即名称/值对。 当我在我的模型中加载一条记录时,我不希望它解析以从数据库中取消分配值,除非我访问它,即延迟初始化。
这是b / c,我的数据库中只有几分之一的行会有哈希值,而且很少会被访问。
这可能吗?
示例用法:
user.properties["age"] = 12
user.properties["height"] = xxx
user.save
我不确定它是如何保存到数据库中的,可能是json格式的?
答案 0 :(得分: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 }
答案 1 :(得分: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"
答案 2 :(得分:0)
您可以使用字符串作为数据类型,并以yaml格式保存哈希值。你需要加载这个yaml字符串,但恕我直言给你更多的可移植性。
hash = {a => b, c=>d}
object.properties = hash.to_yaml
.
.
.
hash = Yaml::load(object.properties)
答案 3 :(得分:0)
值得补充的是,为了正确序列化,preferences
列应具有文字类型,请参阅Using Rails serialize to save hash to database