少し遅れましたが、これでうまくいきました (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)
代わりに支持するために使用されていました-ヒントについては@Offirmo'[]'::JSON
に感謝します。
古い方法の問題点は、実際には配列やオブジェクトをデフォルト値として定義するのではなく、そのように見えるスカラー(文字列) を定義することでした。なぜそれが重要なのですか?
Postgres では、次の 3 種類の値を JSON 列に挿入できます。
オブジェクト
INSERT INTO foo (bar) VALUE('{}')
配列
INSERT INTO foo (bar) VALUE('[]')
スカラー
INSERT INTO foo (bar) VALUE('"string"')
問題は、これら 3 種類を同じ列に混在させると、JSON 演算子を使用できなくなることです。以前に提唱された方法を使用して「[]」のデフォルトを設定し、配列要素を照会した場合、スカラーのデフォルト値を持つ単一の行に遭遇すると、クエリ全体がエラーで中止されます。
=# SELECT * FROM foo WHERE bar->>1 = 'baz';
ERROR: cannot extract element from a scalar