diff --git a/lib/active_model/serializable/utils.rb b/lib/active_model/serializable/utils.rb index efabb6c4..3b5f92c3 100644 --- a/lib/active_model/serializable/utils.rb +++ b/lib/active_model/serializable/utils.rb @@ -4,13 +4,15 @@ module ActiveModel extend self def _const_get(const) - begin - method = RUBY_VERSION >= '2.0' ? :const_get : :qualified_const_get - Object.send method, const - rescue NameError - const.safe_constantize + Serializer.serializers_cache.fetch_or_store(const) do + begin + method = RUBY_VERSION >= '2.0' ? :const_get : :qualified_const_get + Object.send method, const + rescue NameError + const.safe_constantize + end end end end end -end \ No newline at end of file +end diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 82693873..b5ff05da 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -4,6 +4,7 @@ require 'active_model/serializer/association' require 'active_model/serializer/config' require 'thread' +require 'concurrent/map' module ActiveModel class Serializer @@ -100,6 +101,10 @@ end associate(Association::HasMany, *attrs) end + def serializers_cache + @serializers_cache ||= Concurrent::Map.new + end + private def strip_attribute(attr) diff --git a/lib/active_model_serializers.rb b/lib/active_model_serializers.rb index 7066ebf4..8b50eb55 100644 --- a/lib/active_model_serializers.rb +++ b/lib/active_model_serializers.rb @@ -14,6 +14,9 @@ begin ActionController::Base.send(:include, ::ActionController::Serialization) ActionController::TestCase.send(:include, ::ActionController::SerializationAssertions) end + ActionDispatch::Reloader.to_prepare do + ActiveModel::Serializer.serializers_cache.clear + end end rescue LoadError # rails not installed, continuing