Jag skulle skriva migreringen så här:
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
Jag vet inte hur detta kan jämföras prestandamässigt med andra lösningar, men jag testade detta på en tabell med 120 000 poster, där varje post har fyra json
kolumner och det tog mig ungefär en minut att migrera den tabellen. Naturligtvis antar jag att det beror på hur komplex json
är struktur är.
Observera också att om dina befintliga poster har standardvärdet {}
, måste du lägga till default: {}
till ovanstående uttalanden , för annars har du jsonb
kolumner, men standardvärdet förblir '{}'::json
.