Scriverei la migrazione in questo modo:
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
Non so come questo si confronti in termini di prestazioni con altre soluzioni, ma l'ho testato su una tabella con 120.000 record, ogni record con quattro json
colonne e mi ci è voluto circa un minuto per migrare quella tabella. Ovviamente, immagino dipenda da quanto sia complesso il json
struttura è.
Inoltre, nota che se i tuoi record esistenti hanno un valore predefinito di {}
, devi aggiungere alle precedenti istruzioni default: {}
, perché altrimenti avrai jsonb
colonne, ma il valore predefinito rimarrà come '{}'::json
.