@@ -47,6 +47,60 @@ def fetchable_fields
47
47
super - self . class . _attributes . select { |_attr , options | options [ :writeonly ] } . keys -
48
48
self . class . _relationships . select { |_rel_key , rel | rel . options [ :writeonly ] } . keys
49
49
end
50
+
51
+ # Eager load specified models by default. Useful when attributes are
52
+ # dependent on an associated model.
53
+ def self . default_includes ( *inclusions )
54
+ @default_includes = inclusions . freeze
55
+ end
56
+
57
+ def self . inclusions
58
+ @default_includes || [ ] . freeze
59
+ end
60
+
61
+ # Extends the default behaviour to add our default inclusions if provided
62
+ def self . apply_includes ( records , options = { } )
63
+ if @default_includes . present?
64
+ super ( records . preload ( *inclusions ) , options )
65
+ else
66
+ super
67
+ end
68
+ end
69
+
70
+ # The majority of this is lifted from JSONAPI::Resource
71
+ # We've had to modify the when Symbol chunk to handle nested includes
72
+ # We disable the cops for the shared section to avoid accidental drift
73
+ # due to auto-correct.
74
+ # rubocop:disable all
75
+ def self . resolve_relationship_names_to_relations ( resource_klass , model_includes , options = { } )
76
+ case model_includes
77
+ when Array
78
+ return model_includes . map { |value | resolve_relationship_names_to_relations ( resource_klass , value , options ) }
79
+ when Hash
80
+ model_includes . keys . each do |key |
81
+ relationship = resource_klass . _relationships [ key ]
82
+ value = model_includes [ key ]
83
+ model_includes . delete ( key )
84
+
85
+ # MODIFICATION BEGINS
86
+ included_relationships =
87
+ resolve_relationship_names_to_relations ( relationship . resource_klass , value , options )
88
+ model_includes [ relationship . relation_name ( options ) ] = relationship . resource_klass . inclusions +
89
+ included_relationships
90
+ # MODIFICATION ENDS
91
+ end
92
+ return model_includes
93
+ when Symbol
94
+ relationship = resource_klass . _relationships [ model_includes ]
95
+
96
+ # MODIFICATION BEGINS
97
+ # return relationship.relation_name(options)
98
+ inclusions = relationship . resource_klass . inclusions
99
+ { relationship . relation_name ( options ) => inclusions }
100
+ # MODIFICATION ENDS
101
+ end
102
+ end
103
+ # rubocop:enable all
50
104
end
51
105
end
52
106
end
0 commit comments