3scale/porta

View on GitHub
db/migrate/20240726111800_create_annotation_references.rb

Summary

Maintainability
A
20 mins
Test Coverage
class CreateAnnotationReferences < ActiveRecord::Migration[6.1]
  disable_ddl_transaction! if System::Database.postgres?

  def change
    options = "CHARSET=utf8mb4 COLLATE=utf8mb4_bin" if System::Database.mysql?

    create_table :annotations, options: options do |t|
      t.string :name, null: false
      t.string :value
      t.references :annotated, polymorphic: true, index: false, null: false
      t.integer :tenant_id
      t.timestamps

      t.index %i[annotated_type annotated_id name], unique: true
    end

    reversible do |direction|
      direction.up do
        self.class.execute_trigger_action(:recreate)
      end
      direction.down do
        self.class.execute_trigger_action(:drop)
      end
    end
  end

  def self.execute_trigger_action(action)
    trigger = System::Database.triggers.detect { |trigger| trigger.name == "annotations_tenant_id" }

    expressions = [trigger.public_send(action)].flatten
    expressions.each(&ActiveRecord::Base.connection.method(:execute))
  end
end