@@ -119,17 +119,13 @@ def self.attribute(attr, options = {}, &block)
119119 key = options . fetch ( :key , attr )
120120 reader = if block
121121 -> ( instance ) { instance . instance_eval ( &block ) }
122+ elsif _fragmented
123+ -> ( instance ) { instance . class . _fragmented . read_attribute_for_serialization ( attr ) }
122124 else
123- -> ( instance ) { instance . send ( attr ) }
125+ -> ( instance ) { instance . read_attribute_for_serialization ( attr ) }
124126 end
125127
126128 _attribute_mappings [ key ] = Attribute . new ( attr , reader )
127-
128- ActiveModelSerializers . silence_warnings do
129- define_method attr do
130- object . read_attribute_for_serialization ( attr )
131- end unless method_defined? ( attr ) || _fragmented . respond_to? ( attr )
132- end
133129 end
134130
135131 # @api private
@@ -278,11 +274,15 @@ def json_key
278274 def attributes ( requested_attrs = nil )
279275 self . class . _attribute_mappings . each_with_object ( { } ) do |( key , attribute_mapping ) , hash |
280276 next unless requested_attrs . nil? || requested_attrs . include? ( key )
281- if self . class . _fragmented
282- hash [ key ] = self . class . _fragmented . public_send ( attribute_mapping . name )
283- else
284- hash [ key ] = attribute_mapping . call ( self )
285- end
277+ hash [ key ] = attribute_mapping . call ( self )
278+ end
279+ end
280+
281+ def read_attribute_for_serialization ( attr )
282+ if _serializer_method_defined? ( attr )
283+ send ( attr )
284+ else
285+ object . read_attribute_for_serialization ( attr )
286286 end
287287 end
288288
@@ -295,5 +295,15 @@ def links
295295 protected
296296
297297 attr_accessor :instance_options
298+
299+ private
300+
301+ def _serializer_instance_methods
302+ @_serializer_instance_methods ||= ( public_methods - Object . public_instance_methods ) . to_set
303+ end
304+
305+ def _serializer_method_defined? ( name )
306+ _serializer_instance_methods . include? ( name )
307+ end
298308 end
299309end
0 commit comments