@@ -119,17 +119,13 @@ def self.attribute(attr, options = {}, &block)
119
119
key = options . fetch ( :key , attr )
120
120
reader = if block
121
121
-> ( instance ) { instance . instance_eval ( &block ) }
122
+ elsif _fragmented
123
+ -> ( instance ) { instance . class . _fragmented . read_attribute_for_serialization ( attr ) }
122
124
else
123
- -> ( instance ) { instance . send ( attr ) }
125
+ -> ( instance ) { instance . read_attribute_for_serialization ( attr ) }
124
126
end
125
127
126
128
_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
133
129
end
134
130
135
131
# @api private
@@ -278,11 +274,15 @@ def json_key
278
274
def attributes ( requested_attrs = nil )
279
275
self . class . _attribute_mappings . each_with_object ( { } ) do |( key , attribute_mapping ) , hash |
280
276
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 )
286
286
end
287
287
end
288
288
@@ -295,5 +295,15 @@ def links
295
295
protected
296
296
297
297
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
298
308
end
299
309
end
0 commit comments