Class: Dbwatcher::Services::DiagramAnalyzers::ModelAnalysis::ModelDiscovery

Inherits:
Object
  • Object
show all
Defined in:
lib/dbwatcher/services/diagram_analyzers/model_analysis/model_discovery.rb

Overview

Service responsible for discovering and filtering ActiveRecord models

This service handles the complex logic of finding ActiveRecord models that are relevant for diagram analysis, including models from gems, namespaced models, and models with custom table names.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(session_tables = []) ⇒ ModelDiscovery

Initialize with optional session tables for filtering

Parameters:

  • session_tables (Array<String>) (defaults to: [])

    table names from session (empty for global analysis)



18
19
20
21
# File 'lib/dbwatcher/services/diagram_analyzers/model_analysis/model_discovery.rb', line 18

def initialize(session_tables = [])
  @session_tables = session_tables || []
  @discovered_models = []
end

Instance Attribute Details

#discovered_modelsObject (readonly)

Returns the value of attribute discovered_models.



13
14
15
# File 'lib/dbwatcher/services/diagram_analyzers/model_analysis/model_discovery.rb', line 13

def discovered_models
  @discovered_models
end

#session_tablesObject (readonly)

Returns the value of attribute session_tables.



13
14
15
# File 'lib/dbwatcher/services/diagram_analyzers/model_analysis/model_discovery.rb', line 13

def session_tables
  @session_tables
end

Instance Method Details

#discoverArray<Class>

Discover models that correspond to session tables or all models if no session

Returns:

  • (Array<Class>)

    ActiveRecord model classes



26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/dbwatcher/services/diagram_analyzers/model_analysis/model_discovery.rb', line 26

def discover
  return [] unless activerecord_available?

  begin
    all_models = load_all_models
    @discovered_models = filter_models_by_session(all_models)

    log_discovery_results
    @discovered_models
  rescue StandardError => e
    Rails.logger.error "ModelDiscovery: Error discovering models: #{e.message}"
    []
  end
end

#load_all_modelsArray<Class>

Load all available ActiveRecord models including from gems

Returns:

  • (Array<Class>)

    ActiveRecord model classes



44
45
46
47
48
49
50
51
52
53
54
# File 'lib/dbwatcher/services/diagram_analyzers/model_analysis/model_discovery.rb', line 44

def load_all_models
  eager_load_models

  # Get all model classes directly from ActiveRecord descendants
  all_models = ActiveRecord::Base.descendants
                                 .select { |model| valid_model_class?(model) }
                                 .uniq

  Rails.logger.debug "ModelDiscovery: Found #{all_models.size} total ActiveRecord models"
  all_models
end

#model_has_table?(model) ⇒ Boolean

Check if model has a database table

Parameters:

  • model (Class)

    ActiveRecord model class

Returns:

  • (Boolean)

    true if model has a table



80
81
82
83
84
# File 'lib/dbwatcher/services/diagram_analyzers/model_analysis/model_discovery.rb', line 80

def model_has_table?(model)
  model.table_exists?
rescue StandardError
  false
end

#valid_model_class?(model) ⇒ Boolean

Check if a model class is valid for analysis

Parameters:

  • model (Class)

    ActiveRecord model class

Returns:

  • (Boolean)

    true if model is valid



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/dbwatcher/services/diagram_analyzers/model_analysis/model_discovery.rb', line 60

def valid_model_class?(model)
  # Must be a proper class with a name (not anonymous)
  return false unless model.name

  # Must have a table that exists
  return false unless model_has_table?(model)

  # Skip abstract models
  return false if model.abstract_class?

  true
rescue StandardError => e
  Rails.logger.debug "ModelDiscovery: Error validating model #{model}: #{e.message}"
  false
end