Saya akan menulis migrasi dengan cara ini:
def change
reversible do |dir|
dir.up { change_column :models, :attribute, 'jsonb USING CAST(attribute AS jsonb)' }
dir.down { change_column :models, :attribute, 'json USING CAST(attribute AS json)' }
end
end
Saya tidak tahu bagaimana ini membandingkan kinerja dengan solusi lain, tetapi saya menguji ini pada tabel dengan 120.000 catatan, setiap catatan memiliki empat json
kolom dan saya butuh sekitar satu menit untuk memigrasi tabel itu. Tentu saja, saya kira itu tergantung pada seberapa kompleks json
struktur adalah.
Juga, perhatikan bahwa jika catatan Anda yang ada memiliki nilai default {}
, Anda harus menambahkan ke pernyataan di atas default: {}
, karena jika tidak, Anda akan memiliki jsonb
kolom, tetapi nilai default akan tetap sebagai '{}'::json
.