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
.