属于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 而不是 String,即 {}
而不是 '{}'
?
定义为String类型时,该列的类:
String < Object
定义为Hash类型时,该列的类:
Hash
最佳答案
在迁移文件中,您将要使用 {}
与 '{}'
。
我确实为此苦苦挣扎了一段时间,问题是我认为 PG 适配器隐含地知道如何将散列转换为 jsonb 对象。它不像 postgres 数据库中的 json 类型,您在其中存储 json 对象的字符串值,而是实际的二进制对象(在 jsonb 中)。我可能可以在 Rails 4.2 发布代码的某个地方挖掘它,但是,如果你正在寻找它的薄文档(我将在不久的将来添加),这里的关键是你'当你执行 '{}'
时,实际上是从 Postgres 取回一个字符串,因此当你尝试 indifferent_access
它时,它失败了,因为字符串不能有 indifferent使用权。这可能是我第一次意识到他们提供的信息存在一些问题。
老实说,无论如何我都不直接使用 {}
,我更喜欢 []
而不是 {}
,因为通常我在处理非常具体的日志记录功能我想在一条记录上显式记录,而不必将两个大表连接在一起。这是我在 5.0 上的特殊用例,如果您 <5 岁,情况可能会有所不同,但可能相差不大。
关于ruby-on-rails - 我应该在迁移中将 jsonb 默认为 '{}' 还是 {},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37616292/