Migraci bych napsal takto:
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
Nevím, jak se to srovnává z hlediska výkonu s jinými řešeními, ale testoval jsem to na tabulce se 120 000 záznamy, z nichž každý má čtyři json sloupce a migrace této tabulky mi trvala asi minutu. Samozřejmě, myslím, že záleží na tom, jak složitý je json struktura je.
Všimněte si také, že pokud mají vaše stávající záznamy výchozí hodnotu {} , musíte k výše uvedeným příkazům přidat default: {} , protože jinak budete mít jsonb sloupců, ale výchozí hodnota zůstane '{}'::json .