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
.