Как должна выглядеть миграция? Я хотел бы воспользоваться техникой запроса массива jsonb.
Как перенести атрибут модели ActiveRecord из json в jsonb?
Ответы (1)
Я бы написал миграцию так:
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
.
person
Alexander
schedule
26.04.2018
Это не работает с рельсами
5.2.4.3
. Вызвано: PG::SyntaxError: ОШИБКА: синтаксическая ошибка в или около USING LINE 1: SELECT 'jsonb USING Associations::jsonb'::regtype::oid ^ КОНТЕКСТ: недопустимое имя типа jsonb, ИСПОЛЬЗУЮЩЕЕ ассоциации::jsonb
- person Autodidact; 06.08.2020
Привет, @Autodidact, отредактируй ответ, когда найдешь ошибку, чтобы у нас было рабочее решение. Спасибо.
- person Alexander; 06.08.2020