Как перенести атрибут модели ActiveRecord из json в jsonb?

Как должна выглядеть миграция? Я хотел бы воспользоваться техникой запроса массива jsonb.


person retroGiant    schedule 25.04.2018    source источник


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