Skip to content

Commit 0a06c10

Browse files
committed
allow subclasses of ActiveModel::Serializer to override associations
1 parent 88eabdf commit 0a06c10

File tree

3 files changed

+23
-1
lines changed

3 files changed

+23
-1
lines changed

lib/active_model/serializer.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,8 +199,12 @@ def attributes(options = {})
199199
end
200200
end
201201

202+
def associations
203+
self.class._associations.dup
204+
end
205+
202206
def each_association(&block)
203-
self.class._associations.dup.each do |name, association_options|
207+
associations.each do |name, association_options|
204208
next unless object
205209
association_value = send(name)
206210

test/fixtures/poro.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,13 @@ def custom_options
102102
end
103103
end
104104

105+
CustomizablePostSerializer = Class.new(PostSerializer) do
106+
def associations
107+
excludes = @options[:excludes] || []
108+
super.except(*excludes)
109+
end
110+
end
111+
105112
SpammyPostSerializer = Class.new(ActiveModel::Serializer) do
106113
attributes :id
107114
has_many :related

test/serializers/associations_test.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,17 @@ def test_associations_custom_keys
145145
assert expected_association_keys.include? :writer
146146
assert expected_association_keys.include? :site
147147
end
148+
149+
def test_overriding_associations
150+
serializer = CustomizablePostSerializer.new(@post, excludes: [:comments])
151+
152+
association_keys = []
153+
serializer.each_association do |key, serializer, options|
154+
association_keys << key
155+
end
156+
157+
assert association_keys.exclude? :comments
158+
end
148159
end
149160
end
150161
end

0 commit comments

Comments
 (0)