ruby-on-rails – 在Rails <4中设置Postgres JSON列的默认值

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 在Rails <4中设置Postgres JSON列的默认值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我开始使用Postgres JSON数据类型,现在是 there’s a lot of fun stuff you can do with it.
在我的Rails应用程序之一还没有Rails 4(其中 support for Postgres JSON has been added)中,我添加了一个JSON列:
create_table :foo do |t|
  t.column :bar,:json
end

但是我不知道如何设置列的默认值.
我尝试了所有的变体,如{},'{}’,'{}’:: json,'[]’:: json等等,但是我会在迁移运行时收到错误或者它不工作,这意味着迁移运行,但是当我创建一个新的Foo时,bar是零.

解决方法

虽然有点晚,这对我来说(需要Postgres> = 9.3):
create_table :foo do |t|
  t.column :bar,:json
end

execute "ALTER TABLE foo ALTER COLUMN bar SET DEFAULT '[]'::JSON"

编辑:这个答案用于倡导to_json(‘[]’:: text)而不是'[]’:: JSON – 感谢@Offirmo提示.

方法的问题是它并没有将数组或对象实际上定义为默认值,而是一个看起来像一个的标量(字符串).为什么这么重要?

Postgres允许将三种值插入到JSON列中:

>对象

INSERT INTO foo(bar)VALUE(‘{}’)
>数组

INSERT INTO foo(bar)VALUE(‘[]’)
>标尺

INSERT INTO foo(bar)VALUE(‘“string”’)

问题是,如果您在同一列中混合使用这三种,您将无法使用JSON运算符.如果使用先前倡导的方法设置默认值为'[]’,并查询数组元素,遇到具有标量默认值的单个行将中止整个查询,并显示错误

=# SELECT * FROM foo WHERE bar->>1 = 'baz';
ERROR:  cannot extract element from a scalar

猜你在找的Ruby相关文章