Skip to content

Commit 1e04d11

Browse files
authored
Merge pull request #2079 from dylanahsmith/backport-serializers-cache
Backport caching of the constant lookup
2 parents c2565ed + d58a6e1 commit 1e04d11

File tree

4 files changed

+18
-2
lines changed

4 files changed

+18
-2
lines changed

active_model_serializers.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,6 @@ Gem::Specification.new do |gem|
2121
gem.required_ruby_version = ">= 1.9.3"
2222

2323
gem.add_dependency "activemodel", ">= 3.2"
24+
gem.add_dependency "concurrent-ruby", "~> 1.0"
2425
gem.add_development_dependency "rails", ">= 3.2"
2526
end

lib/active_model/serializable.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,11 @@ def serializable_data
3333
end
3434

3535
def namespace
36-
get_namespace && Utils._const_get(get_namespace)
36+
if module_name = get_namespace
37+
Serializer.serializers_cache.fetch_or_store(module_name) do
38+
Utils._const_get(module_name)
39+
end
40+
end
3741
end
3842

3943
def embedded_in_root_associations

lib/active_model/serializer.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
require 'active_model/serializer/config'
55

66
require 'thread'
7+
require 'concurrent/map'
78

89
module ActiveModel
910
class Serializer
@@ -65,7 +66,10 @@ def serializer_for(resource, options = {})
6566
ArraySerializer
6667
end
6768
else
68-
_const_get build_serializer_class(resource, options)
69+
klass_name = build_serializer_class(resource, options)
70+
Serializer.serializers_cache.fetch_or_store(klass_name) do
71+
_const_get(klass_name)
72+
end
6973
end
7074
end
7175

@@ -100,6 +104,10 @@ def has_many(*attrs)
100104
associate(Association::HasMany, *attrs)
101105
end
102106

107+
def serializers_cache
108+
@serializers_cache ||= Concurrent::Map.new
109+
end
110+
103111
private
104112

105113
def strip_attribute(attr)

lib/active_model_serializers.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
ActionController::Base.send(:include, ::ActionController::Serialization)
1515
ActionController::TestCase.send(:include, ::ActionController::SerializationAssertions)
1616
end
17+
ActionDispatch::Reloader.to_prepare do
18+
ActiveModel::Serializer.serializers_cache.clear
19+
end
1720
end
1821
rescue LoadError
1922
# rails not installed, continuing

0 commit comments

Comments
 (0)