From ee76e0c69b31528a223c57830ed178969b29b80b Mon Sep 17 00:00:00 2001 From: Shishir Kakaraddi Date: Sat, 3 Nov 2018 12:11:56 -0700 Subject: [PATCH 1/2] bump up version to 1.5 --- lib/fast_jsonapi/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/fast_jsonapi/version.rb b/lib/fast_jsonapi/version.rb index c9c4c7ab..12442c14 100644 --- a/lib/fast_jsonapi/version.rb +++ b/lib/fast_jsonapi/version.rb @@ -1,3 +1,3 @@ module FastJsonapi - VERSION = "1.4" + VERSION = "1.5" end From daa5a45f509579f5b1afe1af9acbbf421e2f242a Mon Sep 17 00:00:00 2001 From: shidel-dev Date: Mon, 21 Jan 2019 14:29:07 -0800 Subject: [PATCH 2/2] records should be included in known_included_objects to avoid duplication --- lib/fast_jsonapi/object_serializer.rb | 6 +++++- spec/lib/object_serializer_spec.rb | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/fast_jsonapi/object_serializer.rb b/lib/fast_jsonapi/object_serializer.rb index b8a24183..e13430b0 100644 --- a/lib/fast_jsonapi/object_serializer.rb +++ b/lib/fast_jsonapi/object_serializer.rb @@ -43,6 +43,8 @@ def hash_for_one_record return serializable_hash unless @resource + record_type = @resource.class.name.demodulize.underscore + @known_included_objects["#{record_type}_#{self.class.id_from_record(@resource)}"] = @resource serializable_hash[:data] = self.class.record_hash(@resource, @fieldsets[self.class.record_type.to_sym], @params) serializable_hash[:included] = self.class.get_included_records(@resource, @includes, @known_included_objects, @fieldsets, @params) if @includes.present? serializable_hash @@ -55,6 +57,8 @@ def hash_for_collection included = [] fieldset = @fieldsets[self.class.record_type.to_sym] @resource.each do |record| + record_type = record.class.name.demodulize.underscore + @known_included_objects["#{record_type}_#{self.class.id_from_record(record)}"] = record data << self.class.record_hash(record, fieldset, @params) included.concat self.class.get_included_records(record, @includes, @known_included_objects, @fieldsets, @params) if @includes.present? end @@ -75,10 +79,10 @@ def serialized_json def process_options(options) @fieldsets = deep_symbolize(options[:fields].presence || {}) @params = {} + @known_included_objects = {} return if options.blank? - @known_included_objects = {} @meta = options[:meta] @links = options[:links] @is_collection = options[:is_collection] diff --git a/spec/lib/object_serializer_spec.rb b/spec/lib/object_serializer_spec.rb index ef755ccc..a8988462 100644 --- a/spec/lib/object_serializer_spec.rb +++ b/spec/lib/object_serializer_spec.rb @@ -297,6 +297,26 @@ def advertising_campaign expect(groups_serialized).to include(group.id) end end + + it 'does not duplicate records in included' do + options = {} + options[:meta] = { total: 1 } + options[:links] = { self: 'self' } + options[:include] = [:actors, :'movie_type.movies'] + serializable_hash = MovieSerializer.new([movie, movie], options).serializable_hash + + expect(serializable_hash[:data].length).to eq 2 + expect(serializable_hash[:data][0][:relationships].length).to eq 4 + expect(serializable_hash[:data][0][:attributes].length).to eq 2 + + expect(serializable_hash[:meta]).to be_instance_of(Hash) + expect(serializable_hash[:links]).to be_instance_of(Hash) + + expect(serializable_hash[:included]).to be_instance_of(Array) + expect(serializable_hash[:included][0]).to be_instance_of(Hash) + # 3 actors, one movie_type + expect(serializable_hash[:included].length).to eq 4 + end end context 'when testing included do block of object serializer' do