我应该将jsonb默认为' {}'或迁移中的{}

时间:2016-06-03 13:55:28

标签: ruby-on-rails postgresql ruby-on-rails-5 jsonb

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,即{}而不是'{}'

将其定义为String类型时,该列的类:

String < Object

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

Hash

2 个答案:

答案 0 :(得分:8)

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

我真的只是苦苦挣扎了一段时间,问题是我认为PG适配器隐式知道如何将哈希转换为jsonb对象。它不像postgres DB中的json类型,你在那里存储json对象的字符串值,而是一个实际的二进制对象(在jsonb中)。我可以在某个地方的Rails 4.2发布代码中挖掘它,但是,如果您正在查看它上面的精简文档(我将在不久的将来添加它),这里的关键当你'{}'时,你实际上是从Postgres获得一个字符串,因此当你尝试indifferent_access它时,它会失败,因为一个字符串不能有无差别的访问权限。这可能是我第一次抬头,他们提供的信息存在一些问题。

老实说,我无论如何都不能直接使用{},而是[]而不是{},因为我通常会处理非常具体的日志记录功能。无需将两个大表连接在一起的记录。这是我在5.0上的特殊用例,如果你重新<5,可能会有点不同,但可能不是很多。

答案 1 :(得分:0)

只需使用以下内容运行迁移:

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