From da382375293f4077e5204cd7c75cff08d07c5f9b Mon Sep 17 00:00:00 2001 From: Dmitry Rybakov <160598371+comandeo-mongo@users.noreply.github.com> Date: Tue, 3 Dec 2024 11:17:24 +0100 Subject: [PATCH] MONGOID-5831 Remove usage of Rails private API (#5908) --- lib/mongoid/traversable.rb | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/lib/mongoid/traversable.rb b/lib/mongoid/traversable.rb index fbcaeee622..7fb26d5930 100644 --- a/lib/mongoid/traversable.rb +++ b/lib/mongoid/traversable.rb @@ -8,6 +8,29 @@ module Mongoid # around traversing the document graph. module Traversable extend ActiveSupport::Concern + # This code is extracted from ActiveSupport so that we do not depend on + # their private API that may change at any time. + # This code should be reviewed and maybe removed when implementing + # https://jira.mongodb.org/browse/MONGOID-5832 + class << self + # @api private + def __redefine(owner, name, value) + if owner.singleton_class? + owner.redefine_method(name) { value } + owner.send(:public, name) + end + owner.redefine_singleton_method(name) { value } + owner.singleton_class.send(:public, name) + owner.redefine_singleton_method("#{name}=") do |new_value| + if owner.equal?(self) + value = new_value + else + ::Mongoid::Traversable.redefine(self, name, new_value) + end + end + owner.singleton_class.send(:public, "#{name}=") + end + end # Class-level methods for the Traversable behavior. module ClassMethods @@ -105,11 +128,7 @@ def discriminator_key=(value) if value Mongoid::Fields::Validators::Macro.validate_field_name(self, value) value = value.to_s - if defined?(::ActiveSupport::ClassAttribute) - ::ActiveSupport::ClassAttribute.redefine(self, 'discriminator_key', value) - else - super - end + ::Mongoid::Traversable.__redefine(self, 'discriminator_key', value) else # When discriminator key is set to nil, replace the class's definition # of the discriminator key reader (provided by class_attribute earlier)