diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 8452eb4e..8409cf81 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -347,7 +347,7 @@ module ActiveModel return Enumerator.new {} unless object Enumerator.new do |y| - (@reflections ||= self.class._reflections.deep_dup).each do |key, reflection| + (self.instance_reflections ||= self.class._reflections.deep_dup).each do |key, reflection| next if reflection.excluded?(self) next unless include_directive.key?(key) @@ -411,6 +411,6 @@ module ActiveModel protected - attr_accessor :instance_options, :reflections + attr_accessor :instance_options, :instance_reflections end end diff --git a/lib/active_model/serializer/reflection.rb b/lib/active_model/serializer/reflection.rb index a64aa3c4..6353933e 100644 --- a/lib/active_model/serializer/reflection.rb +++ b/lib/active_model/serializer/reflection.rb @@ -151,6 +151,9 @@ module ActiveModel # @yield [ActiveModel::Serializer] # @return [:nil, associated resource or resource collection] def value(serializer, include_slice) + # NOTE(BF): This method isn't thread-safe because the _reflections class attribute is not thread-safe + # Therefore, when we build associations from reflections, we dup the entire reflection instance. + # Better solutions much appreciated! @object = serializer.object @scope = serializer.scope