我应该在迁移中将 jsonb 默认为“{}”还是{}

Should I default jsonb to '{}' or {} in migration

Of 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类型时,该列的class:

String < Object

定义为Hash类型时,该列的class:

Hash

在迁移文件中,您将要使用 {}'{}'

我确实为此苦苦挣扎了一段时间,问题是我认为 PG 适配器隐含地知道如何将散列转换为 jsonb 对象。它不像 postgres 数据库中的 json 类型,您在其中存储 json 对象的字符串值,而是实际的二进制对象(在 jsonb 中)。我可能可以在某个地方的 Rails 4.2 发布代码中挖掘它,但是,如果你正在寻找它的薄文档(我将在不久的将来添加),关键在这里是当您执行 '{}' 时实际上是从 Postgres 取回一个字符串,因此当您尝试 indifferent_access 它时,它会失败,因为字符串不能具有无差异的访问权限。那可能是我第一次提醒他们提供的信息存在一些问题。

老实说,无论如何我都不直接使用 {},更喜欢 [] 而不是 {},因为通常我处理的是非常具体的日志记录功能,我希望在记录中明确显示而不必将两个大表连接在一起。这是我在 5.0 上的特殊用例,如果你 <5,它可能会有点不同,但可能不会太大。

只是 运行 具有以下内容的迁移:

add_column :ref_check_ins, :document, :jsonb, default: {}