Ошибка: целое число выходит за допустимый диапазон

Я думаю, что мы теперь в безопасности!

Мы заметили, что нам нужно было мигрировать столбцы в других таблицах, которые ссылаются на notification_id, а не только на notifications.id. В противном случае services/notifications.rb или services/badge_granter.rb вызывали бы ошибки.


Для любых других крупных форумов, которые в будущем столкнутся с этой проблемой в уведомлениях, вот что мы сделали…

Всего нам пришлось мигрировать четыре столбца в четырех таблицах:

  1. notifications.id
  2. user.seen_notification_id
  3. user_badges.notification_id
  4. shelved_notifications.notification_id

Изначально мы использовали команду ALTER для пункта #1, предложенную выше, но затем, как упоминалось, решили использовать миграции ActiveRecord, чтобы файлы миграций добавлялись в схему.

20230215070319_change_notifications_id_to_bigint.rb
# frozen_string_literal: true

class ChangeNotificationsIdToBigint < ActiveRecord::Migration[6.1]
    def change
        change_column :notifications, :id, :bigint
    end
end
20230215070320_change_user_seen_notification_id_to_bigint.rb
# frozen_string_literal: true

class ChangeUserSeenNotificationIdToBigint < ActiveRecord::Migration[6.1]
    def change
        change_column :users, :seen_notification_id, :bigint
    end
end
20230215070321_change_user_badges_notification_id_to_bigint.rb
# frozen_string_literal: true

class ChangeUserBadgesNotificationIdToBigint < ActiveRecord::Migration[6.1]
    def change
        change_column :user_badges, :notification_id, :bigint
    end
end
20230215070322_change_shelved_notifications_notification_id_to_bigint.rb
# frozen_string_literal: true

class ChangeShelvedNotificationsNotificationIdToBigint < ActiveRecord::Migration[6.1]
    def change
        change_column :shelved_notifications, :notification_id, :bigint
    end
end

В нашей настройке используется кастомный Dockerfile (мы собираем образы, чтобы запускать Discourse и Sidekiq на отдельных ресурсах в Kubernetes), поэтому копирование этих файлов в /db/migrate в рамках нашего Dockerfile было straightforward.

Затем мы просто позволили rake db:migrate обработать остальное. После того как мы выполнили rolling restart всех наших подов Discourse и Sidekiq, всё заработало как ожидалось :crossed_fingers:.

3 лайка