绕过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
是什么,如果,当为空时,它不会返回空哈希?
我非常感谢有关这个的经验丰富的反馈,因为我觉得我错过了一些东西
非常感谢
答案 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