class AddExternalNumbersFieldToChecks < ActiveRecord::Migration[7.2] def change reversible do |dir| dir.down do add_column :checks, :external_number, :integer execute <<~SQL UPDATE checks SET external_number = printf('%d.%d.%d', external_number_1, external_number_2, external_number_3) SQL remove_column :checks, :external_number_1, :integer remove_column :checks, :external_number_2, :integer remove_column :checks, :external_number_3, :integer end end reversible do |dir| dir.up do add_column :checks, :external_number_1, :integer add_column :checks, :external_number_2, :integer add_column :checks, :external_number_3, :integer execute <<~SQL UPDATE checks SET external_number_1 = CAST(SUBSTRING(external_number, 1, INSTR(external_number, '.') - 1) AS integer), external_number_2 = CAST(SUBSTRING(SUBSTRING(external_number, INSTR(external_number, '.') + 1), 1, INSTR(SUBSTRING(external_number, INSTR(external_number, '.') + 1), '.') - 1) AS integer), external_number_3 = CAST(SUBSTRING(SUBSTRING(external_number, INSTR(external_number, '.') + 1), INSTR(SUBSTRING(external_number, INSTR(external_number, '.') + 1), '.') + 1) AS integer) SQL remove_column :checks, :external_number end end end end