Class: CreateDecisionAgentTables

Inherits:
Object
  • Object
show all
Defined in:
lib/generators/decision_agent/install/templates/migration.rb

Instance Method Summary collapse

Instance Method Details

#changeObject



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/generators/decision_agent/install/templates/migration.rb', line 4

def change
  # Rules table
  create_table :rules do |t|
    t.string :rule_id, null: false, index: { unique: true }
    t.string :ruleset, null: false
    t.text :description
    t.string :status, default: "active"
    t.timestamps
  end

  # Rule versions table
  create_table :rule_versions do |t|
    t.string :rule_id, null: false, index: true
    t.integer :version_number, null: false
    t.text :content, null: false # JSON rule definition
    t.string :created_by, null: false, default: "system"
    t.text :changelog
    t.string :status, null: false, default: "draft" # draft, active, archived
    t.timestamps
  end

  # ✅ CRITICAL: Unique constraint prevents duplicate version numbers per rule
  # This protects against race conditions in concurrent version creation
  add_index :rule_versions, i[rule_id version_number], unique: true

  # Index for efficient queries by rule_id and status
  add_index :rule_versions, i[rule_id status]

  # Optional: Partial unique index for PostgreSQL to enforce one active version per rule
  # Uncomment if using PostgreSQL:
  # add_index :rule_versions, [:rule_id, :status],
  #           unique: true,
  #           where: "status = 'active'",
  #           name: 'index_rule_versions_one_active_per_rule'

  # Version tags table — named pointers to specific versions (unique per model + name)
  # NOTE: version_id is intentionally NOT a foreign key so tags survive version deletion
  create_table :rule_version_tags do |t|
    t.string :model_id, null: false
    t.string :name, null: false
    t.bigint :version_id, null: false
    t.timestamps
  end

  # ✅ CRITICAL: Unique constraint — one tag name per model
  add_index :rule_version_tags, i[model_id name], unique: true
  # Index for efficient tag listing per model
  add_index :rule_version_tags, :model_id
end