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

4
retroGiant 25 Апр 2018 в 17:27

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.

6
retroGiant 26 Апр 2018 в 12:55