【问题标题】:Can I save as Model's property as a hash?我可以将模型的属性另存为哈希吗?
【发布时间】:2011-07-09 22:40:18
【问题描述】:

我想做以下事情。

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

这是 b/c,我在 db 中的行中只有一小部分具有哈希值,并且很少会被访问。

这可能吗?

示例用法:

user.properties["age"] = 12

user.properties["height"] = xxx

user.save

我不确定它会如何保存到数据库中,也许是 json 格式?

【问题讨论】:

  • hash 不是这个意思

标签: ruby-on-rails ruby


【解决方案1】:

是的,你可以序列化数据。

摘自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 }

【讨论】:

  • 但是每次我加载对象时这个属性都会被反序列化,对吧?我希望它延迟反序列化,即仅在访问时
【解决方案2】:

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"

【讨论】:

  • 我粘贴了错误的摘录,但您应该在评论中提到这一点。在只发布了一个链接,然后用好的摘录编辑你的帖子并在你的回答中强调我的错误之后,我不禁发现没有保存过程的新的最近编辑是不公平的。
  • 好点。评论您几乎正确的答案会更委婉。抱歉,这不是借口,但我对 StackOverflow 和学习绳索还是新手。我只是想帮助 Ruby 爱好者。
【解决方案3】:

您可以使用字符串作为数据类型,并将其保存为 yaml 格式的哈希。您需要加载此 yaml 字符串,但恕我直言,您可以提供更多的可移植性。

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

【讨论】:

    【解决方案4】:

    值得补充的是,为了进行正确的序列化,preferences 列应该具有 Text 类型,请参阅 Using Rails serialize to save hash to database

    【讨论】:

      猜你喜欢
      • 2023-01-19
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 2013-12-02
      • 2011-02-11
      • 1970-01-01
      相关资源
      最近更新 更多