rails 4.1 / active record data_store hash未初始化/序列化

时间:2014-11-20 19:23:34

标签: ruby-on-rails-4 rails-activerecord datastore

绕过rails提供的这个数据存储的东西,我有些麻烦我

我们说我有一个简单的帖子模型,title,并且出于某种原因,我想在某个地方存储动态属性,调用" { {1}}"

在帖子模型中,我有简单的序列化器:

post_garbage

正如我所说,除了rails doc explains之外,在class Post < ActiveRecord::Base serialize :post_garbage end 字段上没有设置命名访问者

在控制台中播放:

post_garbage
显然,我得到了一个错误。 &#34; the_stuff&#34;不明。 在这里停下来,你想要转储这个data_store的东西,更安全,更容易创建一个新字段来完成工作(如果你必须设置一个访问器,我不会得到它的实用程序data_store字段)。

*但*

如果首先在此p = Post.first p.post_garbage["the_stuff"] = "something" p.save 字段中保存了空哈希:

post_garbage

以下内容成为可能:

p = Post.first
p.post_garbage = {}
p.save

之后:

p = Post.first
p.post_garbage["whatever_i_have_in_mind"] = "some value"
p.save

它没有架构,无需指定访问器;提供预期的东西。 所以我想知道:很多人会期望数据存储区中有一个无模式的东西,但是文档并没有像这样使用它。但它有效,看起来像一个坏技巧。奇迹...

相反,使用p.post_garbage["it_then_get_dynamic"] = "and that's pretty cool" p.save 是什么,如果,当为空时,它不会返回空哈希?

我非常感谢有关这个的经验丰富的反馈,因为我觉得我错过了一些东西

非常感谢

1 个答案:

答案 0 :(得分:1)

这可能与在对象初始化时p.post_garbage中没有值的事实有关。

p.post_garbage["the_stuff"] = "something"

尝试隐式将post_garbage视为哈希值。 哪个最终会与

类似
unset_variable = nil
unset_variable['hash_key'] = 'hash_value'

对属性使用serialize方法告诉Rails它应该期望将Object压缩为键值映射并将其作为文本存储在数据库中。但这并不一定意味着您的对象被实例化为哈希。它可以是任何特定的对象。但是,在对象进行序列化之前,需要将该对象分配给您的属性。 Serialize可以解决在加载时存储和重构它的魔力,但如果未初始化,它不会对该对象的形式做出任何假设。因此,没有任何关于post_garbage对象的任何指示,Ruby将不会期望它是一个哈希值。

至于为什么空的时候没有返回空?空对象和缺少对象之间存在差异。 (即:{} vs nil)。它们不是同一个东西,通常将丢失的对象视为空对象。但是这种区别是有价值的,我希望Rails在加载序列化属性时保留它。

也许您应该尝试使用类似的东西在创建时初始化它?

class Post < ActiveRecord::Base
  serialize :post_garbage
  after_initialize :default_values

  private
    def default_values
      self.post_garbage ||= {}
    end
end