Skip to content

Instantly share code, notes, and snippets.

@Kallin
Created February 2, 2024 18:38
Show Gist options
  • Save Kallin/f730eb3b3946b2929ff06c5b0050a58f to your computer and use it in GitHub Desktop.
Save Kallin/f730eb3b3946b2929ff06c5b0050a58f to your computer and use it in GitHub Desktop.
count how many callbacks per model in your Rails app
require 'csv'
# ensure all classes have been laoded
Rails.application.eager_load!
def calc_callback_counts
models = ApplicationRecord.descendants
class_callback_counts = {}
models.each do |model|
counts = {}
class_callback_counts[model.class_name] = counts
ActiveRecord::Callbacks::CALLBACKS.each do |callback_type|
kind, name = callback_type.to_s.split("_")
chain = model.__callbacks[name.to_sym]&.send(:chain)
filtered = chain&.select { |chain_callback| chain_callback.kind == kind.to_sym }
counts[callback_type] = filtered ? filtered.length : 0
end
end
class_callback_counts
end
class_callback_counts = calc_callback_counts
csv_array = []
csv_header = (['classname'] << ActiveRecord::Callbacks::CALLBACKS).flatten
csv_array << csv_header
class_callback_counts.each do |class_name, callback_counts|
row = ([class_name] << callback_counts.values).flatten
csv_array << row
end
CSV.open('callback_counts.csv', 'wb') do |csv|
csv_array.each do |row|
csv << row
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment