在 the scarce instructions 中,我读过有关在迁移中添加 Postgres 的数据类型 jsonb
的内容,它看起来像这样:
create_table :ref_check_ins do |t|
t.jsonb :document, null: false, default: '{}'
t.index :document, using: :gin
end
但是是否有任何理由反对默认为 Hash intead of String,即
{}
而不是 '{}'
?将其定义为 String 类型时,该列的类:
String < Object
将其定义为 Hash 类型时,该列的类:
Hash
最佳答案
在迁移文件中,您将要使用 {}
与 '{}'
。
我真的只是为此苦苦挣扎了一段时间,问题是我认为 PG 适配器隐含地知道如何将哈希转换为 jsonb 对象。它不像 postgres 数据库中的 json 类型,你存储的是一个 json 对象的字符串值,而是一个实际的二进制对象(在 jsonb 中)。我可能会在某个地方的 Rails 4.2 发布代码中挖掘它,但是,如果您正在查看它的薄文档(我将在不久的将来添加到其中),这里的关键是您当您执行 '{}'
时,实际上重新从 Postgres 取回一个字符串,因此当您尝试 indifferent_access
时,它失败了,因为字符串不能具有无差别访问。这可能是我第一次提醒他们提供的信息存在一些问题。
老实说,我无论如何都不会直接使用 {}
,而是更喜欢 []
而不是 {}
,因为通常我正在处理非常具体的日志记录功能,我希望在记录上显式显示,而不必将两个大表连接在一起。这是我在 5.0 上的特殊用例,如果您小于 5,可能会有所不同,但可能相差不大。
关于ruby-on-rails - 我应该在迁移中默认 jsonb 为 '{}' 还是 {},我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37616292/