Бих написал миграцията по следния начин:
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
Не знам как това се сравнява по отношение на производителността с други решения, но тествах това на таблица със 120 000 записа, като всеки запис има четири json
колони и ми отне около минута да мигрирам тази таблица. Разбира се, предполагам, че зависи от това колко сложен е json
структура е.
Освен това забележете, че ако вашите съществуващи записи имат стойност по подразбиране {}
, трябва да добавите към горните изрази default: {}
, защото в противен случай ще имате jsonb
колони, но стойността по подразбиране ще остане като '{}'::json
.