diff options
Diffstat (limited to 'lib/gem_extensions/active_record/delegate_cache.rb')
-rw-r--r-- | lib/gem_extensions/active_record/delegate_cache.rb | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/gem_extensions/active_record/delegate_cache.rb b/lib/gem_extensions/active_record/delegate_cache.rb new file mode 100644 index 00000000000..63c93f7a2d3 --- /dev/null +++ b/lib/gem_extensions/active_record/delegate_cache.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +module GemExtensions + module ActiveRecord + module DelegateCache + def relation_delegate_class(klass) + @relation_delegate_cache2[klass] || super # rubocop:disable Gitlab/ModuleWithInstanceVariables + end + + def initialize_relation_delegate_cache_disable_joins + @relation_delegate_cache2 = {} # rubocop:disable Gitlab/ModuleWithInstanceVariables + + [ + ::GemExtensions::ActiveRecord::DisableJoins::Relation + ].each do |klass| + delegate = Class.new(klass) do + include ::ActiveRecord::Delegation::ClassSpecificRelation + end + include_relation_methods(delegate) + mangled_name = klass.name.gsub("::", "_") + const_set mangled_name, delegate + private_constant mangled_name + + @relation_delegate_cache2[klass] = delegate # rubocop:disable Gitlab/ModuleWithInstanceVariables + end + end + + def inherited(child_class) + child_class.initialize_relation_delegate_cache_disable_joins + super + end + end + end +end |