Eu escreveria a migração desta forma:
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
Não sei como isso se compara em termos de desempenho a outras soluções, mas testei isso em uma tabela com 120.000 registros, cada registro com quatro
json colunas e levei cerca de um minuto para migrar essa tabela. Claro, acho que depende de quão complexo o json estrutura é. Além disso, observe que, se seus registros existentes tiverem um valor padrão de
{} , você deve adicionar às instruções acima default: {} , porque senão você terá jsonb colunas, mas o valor padrão permanecerá como '{}'::json .