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 .