Escribiría la migración de esta manera:
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
No sé cómo se compara esto en términos de rendimiento con otras soluciones, pero probé esto en una tabla con 120 000 registros, cada registro con cuatro json
columnas y me tomó alrededor de un minuto migrar esa tabla. Por supuesto, supongo que depende de cuán complejo sea el json
la estructura es.
Además, tenga en cuenta que si sus registros existentes tienen un valor predeterminado de {}
, debe agregar a las declaraciones anteriores default: {}
, porque de lo contrario tendrás jsonb
columnas, pero el valor predeterminado permanecerá como '{}'::json
.