Skip to content

Instantly share code, notes, and snippets.

@ugnius-s
Created August 20, 2021 13:05
Show Gist options
  • Save ugnius-s/4d9c3465068641a087c1388bc90599c4 to your computer and use it in GitHub Desktop.
Save ugnius-s/4d9c3465068641a087c1388bc90599c4 to your computer and use it in GitHub Desktop.
# Rails foreign key levels
table_names = (ActiveRecord::Base.connection.tables - %w[ar_internal_metadata schema_migrations])
$levels = table_names.map do |table_name|
[table_name, 0]
end.to_h
$dependencies = table_names.map do |table_name|
[table_name, []]
end.to_h
$links = table_names.map do |table_name|
[table_name, []]
end.to_h
table_names.each do |table_name|
foreign_keys = ActiveRecord::Base.connection.foreign_keys(table_name)
foreign_keys.each do |foreign_key|
$links[foreign_key.to_table] |= [foreign_key.from_table]
$dependencies[foreign_key.from_table] |= [foreign_key.to_table]
end
end
def update_levels(tables)
tables.each do |parent_table|
$links[parent_table].each do |child_table|
$levels[child_table] = [$levels[parent_table] + 1, $levels[child_table]].max
end
update_levels($links[parent_table])
end
end
root_tables = $dependencies.select { |table, dependencies| dependencies.size == 0 }.keys
update_levels(root_tables)
puts $levels
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment