J'écrirais la migration de cette façon :
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
Je ne sais pas comment cela se compare en termes de performances à d'autres solutions, mais j'ai testé cela sur une table avec 120 000 enregistrements, chaque enregistrement ayant quatre json
colonnes et il m'a fallu environ une minute pour migrer cette table. Bien sûr, je suppose que cela dépend de la complexité du json
structure est.
Notez également que si vos enregistrements existants ont une valeur par défaut de {}
, vous devez ajouter aux instructions ci-dessus default: {}
, car sinon vous aurez jsonb
colonnes, mais la valeur par défaut restera comme '{}'::json
.