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 .