Jeg ville skrive migreringen på denne måde:
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
Jeg ved ikke, hvordan dette kan sammenlignes med andre løsninger, men jeg testede dette på en tabel med 120.000 poster, hvor hver post har fire json
kolonner, og det tog mig omkring et minut at migrere den tabel. Det afhænger selvfølgelig af, hvor kompleks json
er struktur er.
Bemærk også, at hvis dine eksisterende poster har en standardværdi på {}
, skal du tilføje til ovenstående udsagn default: {}
, for ellers har du jsonb
kolonner, men standardværdien forbliver som '{}'::json
.