Created
February 2, 2024 18:38
-
-
Save Kallin/f730eb3b3946b2929ff06c5b0050a58f to your computer and use it in GitHub Desktop.
count how many callbacks per model in your Rails app
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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