summaryrefslogtreecommitdiff
path: root/lib/gitlab/database/loose_foreign_keys.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/database/loose_foreign_keys.rb')
-rw-r--r--lib/gitlab/database/loose_foreign_keys.rb38
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/gitlab/database/loose_foreign_keys.rb b/lib/gitlab/database/loose_foreign_keys.rb
new file mode 100644
index 00000000000..1ecfb5ce47f
--- /dev/null
+++ b/lib/gitlab/database/loose_foreign_keys.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module LooseForeignKeys
+ def self.definitions_by_table
+ @definitions_by_table ||= definitions.group_by(&:to_table).with_indifferent_access.freeze
+ end
+
+ def self.definitions
+ @definitions ||= loose_foreign_keys_yaml.flat_map do |child_table_name, configs|
+ configs.map { |config| build_definition(child_table_name, config) }
+ end.freeze
+ end
+
+ def self.build_definition(child_table_name, config)
+ parent_table_name = config.fetch('table')
+
+ ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(
+ child_table_name,
+ parent_table_name,
+ {
+ column: config.fetch('column'),
+ on_delete: config.fetch('on_delete').to_sym,
+ gitlab_schema: GitlabSchema.table_schema(child_table_name)
+ }
+ )
+ end
+
+ def self.loose_foreign_keys_yaml
+ @loose_foreign_keys_yaml ||= YAML.load_file(Rails.root.join('lib/gitlab/database/gitlab_loose_foreign_keys.yml'))
+ end
+
+ private_class_method :build_definition
+ private_class_method :loose_foreign_keys_yaml
+ end
+ end
+end