From b358271ef5643bfb19c07333c3fb72ad834a9105 Mon Sep 17 00:00:00 2001 From: Benjamin Fleischer Date: Thu, 1 Nov 2018 14:20:20 -0500 Subject: [PATCH] Note that we dup the entire reflection instance --- lib/active_model/serializer.rb | 4 ++-- lib/active_model/serializer/reflection.rb | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) 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