@@ -9,26 +9,18 @@ def initialize(adapter, serializer, options)
9
9
@serializer = serializer
10
10
end
11
11
12
- # TODO: Use Serializable::Resource
13
- # TODO: call +constantize+ less
14
12
# 1. Create a CachedSerializer and NonCachedSerializer from the serializer class
15
13
# 2. Serialize the above two with the given adapter
16
14
# 3. Pass their serializations to the adapter +::fragment_cache+
17
15
def fetch
18
- klass = serializer . class
19
- # It will split the serializer into two, one that will be cached and one that will not
20
- serializers = fragment_serializer ( serializer . object . class . name , klass )
21
-
22
- # Instantiate both serializers
23
- cached_serializer = serializers [ :cached ] . constantize . new ( serializer . object )
24
- non_cached_serializer = serializers [ :non_cached ] . constantize . new ( serializer . object )
16
+ object = serializer . object
25
17
26
- cached_adapter = adapter . class . new ( cached_serializer , instance_options )
27
- non_cached_adapter = adapter . class . new ( non_cached_serializer , instance_options )
18
+ # It will split the serializer into two, one that will be cached and one that will not
19
+ serializers = fragment_serializer ( object . class . name )
28
20
29
21
# Get serializable hash from both
30
- cached_hash = cached_adapter . serializable_hash
31
- non_cached_hash = non_cached_adapter . serializable_hash
22
+ cached_hash = serialize ( object , serializers [ :cached ] )
23
+ non_cached_hash = serialize ( object , serializers [ :non_cached ] )
32
24
33
25
# Merge both results
34
26
adapter . fragment_cache ( cached_hash , non_cached_hash )
@@ -40,31 +32,38 @@ def fetch
40
32
41
33
private
42
34
43
- # Given a serializer class and a hash of its cached and non-cached serializers
35
+ def serialize ( object , serializer_class )
36
+ ActiveModel ::SerializableResource . new (
37
+ object ,
38
+ serializer : serializer_class ,
39
+ adapter : adapter . class
40
+ ) . serializable_hash
41
+ end
42
+
43
+ # Given a hash of its cached and non-cached serializers
44
44
# 1. Determine cached attributes from serializer class options
45
45
# 2. Add cached attributes to cached Serializer
46
46
# 3. Add non-cached attributes to non-cached Serializer
47
- def cached_attributes ( klass , serializers )
48
- attributes = serializer . class . _attributes
49
- cached_attributes = klass . _cache_only ? klass . _cache_only : attributes . reject { |attr | klass . _cache_except . include? ( attr ) }
47
+ def cache_attributes ( serializers )
48
+ klass = serializer . class
49
+ attributes = klass . _attributes
50
+ cache_only = klass . _cache_only
51
+ cached_attributes = cache_only ? cache_only : attributes - klass . _cache_except
50
52
non_cached_attributes = attributes - cached_attributes
53
+ attributes_keys = klass . _attributes_keys
51
54
52
- cached_attributes . each do |attribute |
53
- options = serializer . class . _attributes_keys [ attribute ]
54
- options ||= { }
55
- # Add cached attributes to cached Serializer
56
- serializers [ :cached ] . constantize . attribute ( attribute , options )
57
- end
55
+ add_attributes_to_serializer ( serializers [ :cached ] , cached_attributes , attributes_keys )
56
+ add_attributes_to_serializer ( serializers [ :non_cached ] , non_cached_attributes , attributes_keys )
57
+ end
58
58
59
- non_cached_attributes . each do |attribute |
60
- options = serializer . class . _attributes_keys [ attribute ]
61
- options ||= { }
62
- # Add non-cached attributes to non-cached Serializer
63
- serializers [ :non_cached ] . constantize . attribute ( attribute , options )
59
+ def add_attributes_to_serializer ( serializer , attributes , attributes_keys )
60
+ attributes . each do |attribute |
61
+ options = attributes_keys [ attribute ] || { }
62
+ serializer . attribute ( attribute , options )
64
63
end
65
64
end
66
65
67
- # Given a resource name and its serializer's class
66
+ # Given a resource name
68
67
# 1. Dyanmically creates a CachedSerializer and NonCachedSerializer
69
68
# for a given class 'name'
70
69
# 2. Call
@@ -81,30 +80,36 @@ def cached_attributes(klass, serializers)
81
80
# User_AdminCachedSerializer
82
81
# User_AdminNOnCachedSerializer
83
82
#
84
- def fragment_serializer ( name , klass )
83
+ def fragment_serializer ( name )
84
+ klass = serializer . class
85
85
cached = "#{ to_valid_const_name ( name ) } CachedSerializer"
86
86
non_cached = "#{ to_valid_const_name ( name ) } NonCachedSerializer"
87
87
88
- Object . const_set cached , Class . new ( ActiveModel :: Serializer ) unless Object . const_defined? ( cached )
89
- Object . const_set non_cached , Class . new ( ActiveModel :: Serializer ) unless Object . const_defined? ( non_cached )
88
+ cached_serializer = get_or_create_serializer ( cached )
89
+ non_cached_serializer = get_or_create_serializer ( non_cached )
90
90
91
91
klass . _cache_options ||= { }
92
- klass . _cache_options [ :key ] = klass . _cache_key if klass . _cache_key
93
-
94
- cached . constantize . cache ( klass . _cache_options )
92
+ cache_key = klass . _cache_key
93
+ klass . _cache_options [ :key ] = cache_key if cache_key
94
+ cached_serializer . cache ( klass . _cache_options )
95
95
96
- # Preserve the type setting in the cached/non-cached serializer classes
97
- cached . constantize . type ( klass . _type )
98
- non_cached . constantize . type ( klass . _type )
96
+ type = klass . _type
97
+ cached_serializer . type ( type )
98
+ non_cached_serializer . type ( type )
99
99
100
- cached . constantize . fragmented ( serializer )
101
- non_cached . constantize . fragmented ( serializer )
100
+ non_cached_serializer . fragmented ( serializer )
101
+ cached_serializer . fragmented ( serializer )
102
102
103
- serializers = { cached : cached , non_cached : non_cached }
104
- cached_attributes ( klass , serializers )
103
+ serializers = { cached : cached_serializer , non_cached : non_cached_serializer }
104
+ cache_attributes ( serializers )
105
105
serializers
106
106
end
107
107
108
+ def get_or_create_serializer ( name )
109
+ return Object . const_get ( name ) if Object . const_defined? ( name )
110
+ Object . const_set ( name , Class . new ( ActiveModel ::Serializer ) )
111
+ end
112
+
108
113
def to_valid_const_name ( name )
109
114
name . gsub ( '::' , '_' )
110
115
end
0 commit comments