Napisałbym migrację w ten sposób:
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
Nie wiem, jak to ma się w porównaniu z innymi rozwiązaniami pod względem wydajności, ale przetestowałem to na tabeli ze 120 000 rekordów, z których każdy ma cztery json
kolumny i migracja tej tabeli zajęła mi około minuty. Oczywiście myślę, że to zależy od tego, jak złożony jest json
struktura jest.
Zauważ też, że jeśli Twoje istniejące rekordy mają domyślną wartość {}
, musisz dodać do powyższych instrukcji default: {}
, bo inaczej będziesz miał jsonb
kolumn, ale wartość domyślna pozostanie jako '{}'::json
.