iachat/db/migrate/20260226222000_create_captain_unit_inboxes.rb

44 lines
1.5 KiB
Ruby

class CreateCaptainUnitInboxes < ActiveRecord::Migration[7.0]
def up
create_table :captain_unit_inboxes do |t|
t.bigint :captain_unit_id, null: false
t.bigint :inbox_id, null: false
t.timestamps
end
add_index :captain_unit_inboxes, [:captain_unit_id, :inbox_id], unique: true, name: 'index_captain_unit_inboxes_on_unit_and_inbox'
add_index :captain_unit_inboxes, :inbox_id, name: 'index_captain_unit_inboxes_on_inbox_id'
add_foreign_key :captain_unit_inboxes, :captain_units, column: :captain_unit_id, on_delete: :cascade
add_foreign_key :captain_unit_inboxes, :inboxes, column: :inbox_id, on_delete: :cascade
# Migra dados existentes: cada unit que já tinha inbox_id ganha um registro na pivot
execute <<~SQL.squish
INSERT INTO captain_unit_inboxes (captain_unit_id, inbox_id, created_at, updated_at)
SELECT id, inbox_id, NOW(), NOW()
FROM captain_units
WHERE inbox_id IS NOT NULL
ON CONFLICT DO NOTHING
SQL
# Zera a coluna antiga (mas não a remove — remoção fica para migration futura)
execute 'UPDATE captain_units SET inbox_id = NULL WHERE inbox_id IS NOT NULL'
end
def down
# Restaura o inbox_id da primeira linha da pivot (rollback best-effort)
execute <<~SQL.squish
UPDATE captain_units cu
SET inbox_id = (
SELECT cui.inbox_id
FROM captain_unit_inboxes cui
WHERE cui.captain_unit_id = cu.id
ORDER BY cui.created_at
LIMIT 1
)
SQL
drop_table :captain_unit_inboxes
end
end