Skip to content

Commit e613d55

Browse files
takaokoujiclaude
andcommitted
Refactor: Extract ResourceSetResultMethods module
- Extract common resource/resources methods into ResourceSetResultMethods module - Use iterator pattern with each_resource for efficiency - Include module in ResourceSetOperationResult and ResourcesSetOperationResult Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 406a196 commit e613d55

1 file changed

Lines changed: 33 additions & 49 deletions

File tree

lib/jsonapi/operation_result.rb

Lines changed: 33 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,35 @@ def to_hash(serializer = nil)
2121
end
2222
end
2323

24+
# Backward compatibility module for 0.9.x result.resource access
25+
# In 0.9.x, OperationResult had a `resource` accessor that returned the single resource.
26+
# This module provides the same interface for code that relied on `result.resource`.
27+
module ResourceSetResultMethods
28+
# Returns the first resource from the resource_set
29+
def resource
30+
each_resource { |r| return r }
31+
nil
32+
end
33+
34+
# Returns all resources from the resource_set
35+
def resources
36+
result = []
37+
each_resource { |r| result << r }
38+
result
39+
end
40+
41+
private
42+
43+
def each_resource
44+
return unless resource_set&.resource_klasses
45+
resource_set.resource_klasses.each_value do |identities|
46+
identities.each_value do |data|
47+
yield data[:resource] if data[:resource]
48+
end
49+
end
50+
end
51+
end
52+
2453
class ErrorsOperationResult < OperationResult
2554
attr_accessor :errors
2655

@@ -41,6 +70,8 @@ def to_hash(serializer = nil)
4170
end
4271

4372
class ResourceSetOperationResult < OperationResult
73+
include ResourceSetResultMethods
74+
4475
attr_accessor :resource_set, :pagination_params
4576

4677
def initialize(code, resource_set, options = {})
@@ -58,35 +89,11 @@ def to_hash(serializer)
5889
# :nocov:
5990
end
6091
end
61-
62-
# Returns the first resource from the resource_set for backward compatibility with 0.9.x
63-
# In 0.9.x, OperationResult had a `resource` accessor that returned the single resource.
64-
# This method provides the same interface for code that relied on `result.resource`.
65-
def resource
66-
return nil unless resource_set&.resource_klasses
67-
resource_set.resource_klasses.each_value do |identities|
68-
identities.each_value do |data|
69-
return data[:resource] if data[:resource]
70-
end
71-
end
72-
nil
73-
end
74-
75-
# Returns all resources from the resource_set for backward compatibility with 0.9.x
76-
# Useful when the result contains multiple resources.
77-
def resources
78-
return [] unless resource_set&.resource_klasses
79-
result = []
80-
resource_set.resource_klasses.each_value do |identities|
81-
identities.each_value do |data|
82-
result << data[:resource] if data[:resource]
83-
end
84-
end
85-
result
86-
end
8792
end
8893

8994
class ResourcesSetOperationResult < OperationResult
95+
include ResourceSetResultMethods
96+
9097
attr_accessor :resource_set, :pagination_params, :record_count, :page_count
9198

9299
def initialize(code, resource_set, options = {})
@@ -106,29 +113,6 @@ def to_hash(serializer)
106113
# :nocov:
107114
end
108115
end
109-
110-
# Returns the first resource from the resource_set for backward compatibility with 0.9.x
111-
def resource
112-
return nil unless resource_set&.resource_klasses
113-
resource_set.resource_klasses.each_value do |identities|
114-
identities.each_value do |data|
115-
return data[:resource] if data[:resource]
116-
end
117-
end
118-
nil
119-
end
120-
121-
# Returns all resources from the resource_set for backward compatibility with 0.9.x
122-
def resources
123-
return [] unless resource_set&.resource_klasses
124-
result = []
125-
resource_set.resource_klasses.each_value do |identities|
126-
identities.each_value do |data|
127-
result << data[:resource] if data[:resource]
128-
end
129-
end
130-
result
131-
end
132116
end
133117

134118
class RelatedResourcesSetOperationResult < ResourcesSetOperationResult

0 commit comments

Comments
 (0)