我可以将Model的属性另存为哈希吗?

时间:2011-03-06 20:17:59

标签: ruby-on-rails ruby

我想做以下事情。

我希望我的模型有一个存储哈希值的列,即名称/值对。 当我在我的模型中加载一条记录时,我不希望它解析以从数据库中取消分配值,除非我访问它,即延迟初始化。

这是b / c,我的数据库中只有几分之一的行会有哈希值,而且很少会被访问。

这可能吗?

示例用法:

user.properties["age"] = 12

user.properties["height"] = xxx

user.save

我不确定它是如何保存到数据库中的,可能是json格式的?

4 个答案:

答案 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