0.0
No release in over 3 years
A gem to visualize which records will be deleted due to dependent: :destroy and similar options in ActiveRecord associations
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Development

>= 6.1
~> 3.0
~> 1.0
~> 1.7

Runtime

 Project Readme

BlastRadius

A Ruby gem for visualizing the cascade deletion impact in Rails applications. BlastRadius helps you understand which records will be deleted when you delete a record, based on ActiveRecord associations with dependent options.

Features

  • Dependency Analysis: Analyze ActiveRecord model associations and their dependent options
  • Cascade Visualization: Build and visualize dependency trees showing cascade deletion paths
  • Impact Calculation: Calculate the actual number of records that would be deleted
  • Multiple Dependent Types: Support for :destroy, :delete_all, :destroy_async, :nullify, :restrict_with_exception, :restrict_with_error
  • Multiple Output Formats:
    • Text: ASCII tree for terminal/console
    • Mermaid: Diagrams for Markdown (GitHub, GitLab)
    • JSON: Machine-readable format for APIs
    • DOT: Graphviz format for generating images (PNG, SVG, PDF)
    • HTML: Self-contained interactive visualization
  • Rails Integration: ActiveRecord DSL, Rake tasks, and console helpers
  • Configurable: Depth limits, model exclusion patterns, and format options
  • Safe: Dry-run mode to preview deletions without actually deleting

Installation

Add this line to your application's Gemfile:

gem 'blast_radius'

And then execute:

bundle install

Usage

Basic Usage

# Analyze a model
tree = BlastRadius.analyze(User)

# Format as text
formatter = BlastRadius::Formatters::TextFormatter.new
puts formatter.format(tree)

Rails Integration

ActiveRecord DSL

# Class method - analyze model dependencies
User.blast_radius                      # Default format (text)
User.blast_radius(format: :mermaid)    # Mermaid format
User.blast_radius(format: :json)       # JSON format
User.blast_radius(format: :dot)        # DOT (Graphviz) format
User.blast_radius(format: :html)       # HTML format

# Instance methods - analyze specific record impact
user = User.find(1)
user.blast_radius_impact               # Returns hash of model => count
user.blast_radius_dry_run              # Returns detailed impact with sample IDs

Rake Tasks

# Visualize all models
rails blast_radius:visualize

# Visualize specific model
rails blast_radius:visualize[User]

# Visualize with different format
rails blast_radius:visualize[User,mermaid]
FORMAT=json rails blast_radius:visualize[User]

# Calculate impact of deleting a specific record
rails blast_radius:impact[User,123]

# Generate HTML file
rails blast_radius:html[User,output.html]

Impact Calculation

Calculate the actual number of records that would be deleted:

user = User.find(1)

# Simple count
impact = user.blast_radius_impact
# => {"Post" => 5, "Comment" => 20, "Like" => 100}

# Detailed information with sample IDs
detailed = user.blast_radius_dry_run
# => {
#   "Post" => {
#     count: 5,
#     dependent_type: :destroy,
#     sample_ids: [1, 2, 3, 4, 5]
#   },
#   "Comment" => {...}
# }

Configuration

# config/initializers/blast_radius.rb
BlastRadius.configure do |config|
  config.max_depth = 10
  config.default_format = :text
  config.include_nullify = false
  config.include_restrict = false
  config.exclude_models = [/^HABTM_/, /^ActiveStorage::/]
  config.colorize = true
end

Output Format Examples

BlastRadius supports multiple output formats for different use cases. See the examples/ directory for complete examples.

Text Format (ASCII Tree)

Terminal-friendly output with box-drawing characters:

User
├── [destroy] posts (Post)
│   ├── [destroy] comments (Comment)
│   │   └── [destroy] reactions (Reaction)
│   └── [delete_all] likes (Like)
├── [destroy] profile (Profile)
└── [destroy_async] notifications (Notification)

Mermaid Format

For documentation in Markdown (GitHub, GitLab):

graph TD
    User -->|posts|destroy| node1[Post]
    node1 -->|comments|destroy| node2[Comment]
    node2 -->|reactions|destroy| node3[Reaction]
    node1 -->|likes|delete_all| node4[Like]
    User -->|profile|destroy| node5[Profile]
    User -->|notifications|destroy_async| node6[Notification]
Loading

JSON Format

For programmatic processing:

{
  "model": "User",
  "children": [
    {
      "model": "Post",
      "association": "posts",
      "type": "has_many",
      "dependent": "destroy",
      "children": [
        {
          "model": "Comment",
          "association": "comments",
          "type": "has_many",
          "dependent": "destroy"
        }
      ]
    }
  ]
}

DOT Format (Graphviz)

Generate PNG/SVG/PDF diagrams:

User.blast_radius(format: :dot) # => DOT format output
# Save and convert:
# dot -Tpng output.dot -o diagram.png

HTML Format (Interactive ER Diagram)

The HTML formatter generates a professional, interactive Entity-Relationship diagram with cascade deletion heatmap:

# Generate interactive HTML
html = User.blast_radius(format: :html)
File.write('blast_radius.html', html)

# Open in browser to see:
# - Full ER diagram of all models
# - Click any model to see cascade deletion impact
# - Color-coded heatmap (red → orange → yellow by depth)
# - Multiple layout algorithms (Force, Tree)
# - Zoom, pan, and export capabilities

Core Features:

  • Heatmap Visualization: Click on any table to see which other tables will be affected when deleting records
  • Depth-Based Coloring:
    • 🔴 Red: Directly deleted (depth 1)
    • 🟠 Orange: Indirectly deleted (depth 2)
    • 🟡 Yellow: Further cascades (depth 3+)
    • ⬜ Gray: Unaffected tables

Layout Algorithms:

  • ⚡ Force: Physics-based automatic layout (default)
  • 🌳 Tree: Hierarchical top-down view from selected model

Interaction:

  • Mouse Wheel: Zoom in/out
  • Drag Background: Pan across the graph
  • Click Node: Select and see cascade impact
  • Hover: Tooltips with model and association details
  • Fit to Screen: Auto-zoom to show all nodes

Export:

  • SVG: Vector format for editing
  • PNG: Raster format for presentations

Keyboard Shortcuts:

  • Escape: Reset selection
  • F: Fit to screen
  • +/-: Zoom in/out

Technical:

  • No External Dependencies: Completely self-contained HTML file
  • Dark Mode: Automatically adapts to OS preference
  • Responsive Design: Works on desktop and mobile
  • Console Access: window.blastRadiusGraph for programmatic control

See the examples/ directory for complete output samples.

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests.

Requirements

  • Ruby >= 3.0.0
  • Rails >= 6.1 (ActiveRecord)

License

The gem is available as open source under the terms of the MIT License.

Contributing

Bug reports and pull requests are welcome on GitHub.