diff --git a/lib/fast_jsonapi/serialization_core.rb b/lib/fast_jsonapi/serialization_core.rb index 0cbdad0..3f20b4a 100644 --- a/lib/fast_jsonapi/serialization_core.rb +++ b/lib/fast_jsonapi/serialization_core.rb @@ -53,9 +53,10 @@ module FastJsonapi def relationships_hash(record, relationships = nil, fieldset = nil, includes_list = nil, params = {}) relationships = relationships_to_serialize if relationships.nil? - relationships = relationships.slice(*fieldset) if fieldset.present? - relationships = {} if fieldset == [] + relationship_fieldset = fieldset.present? ? fieldset & relationships.keys : [] + return nil if fieldset.present? && relationship_fieldset.empty? + relationships = relationships.slice(*relationship_fieldset) if fieldset.present? relationships.each_with_object({}) do |(key, relationship), hash| included = includes_list.present? && includes_list.include?(key) relationship.serialize(record, included, params, hash) @@ -72,15 +73,15 @@ module FastJsonapi record_hash = cache_store_instance.fetch(record, **cache_opts) do temp_hash = id_hash(id_from_record(record, params), record_type, true) temp_hash[:attributes] = attributes_hash(record, fieldset, params) if attributes_to_serialize.present? - temp_hash[:relationships] = relationships_hash(record, cachable_relationships_to_serialize, fieldset, includes_list, params) if cachable_relationships_to_serialize.present? + temp_hash[:relationships] = relationships_hash(record, cachable_relationships_to_serialize, fieldset, includes_list, params) if cachable_relationships_to_serialize.present? && relationships_hash(record, cachable_relationships_to_serialize, fieldset, includes_list, params).present? temp_hash[:links] = links_hash(record, params) if data_links.present? temp_hash end - record_hash[:relationships] = (record_hash[:relationships] || {}).merge(relationships_hash(record, uncachable_relationships_to_serialize, fieldset, includes_list, params)) if uncachable_relationships_to_serialize.present? + record_hash[:relationships] = (record_hash[:relationships] || {}).merge(relationships_hash(record, uncachable_relationships_to_serialize, fieldset, includes_list, params)) if uncachable_relationships_to_serialize.present? && relationships_hash(record, nil, fieldset, includes_list, params).present? else record_hash = id_hash(id_from_record(record, params), record_type, true) record_hash[:attributes] = attributes_hash(record, fieldset, params) if attributes_to_serialize.present? - record_hash[:relationships] = relationships_hash(record, nil, fieldset, includes_list, params) if relationships_to_serialize.present? + record_hash[:relationships] = relationships_hash(record, nil, fieldset, includes_list, params) if relationships_to_serialize.present? && relationships_hash(record, nil, fieldset, includes_list, params).present? record_hash[:links] = links_hash(record, params) if data_links.present? end diff --git a/spec/integration/attributes_fields_spec.rb b/spec/integration/attributes_fields_spec.rb index d590aff..8273e60 100644 --- a/spec/integration/attributes_fields_spec.rb +++ b/spec/integration/attributes_fields_spec.rb @@ -57,6 +57,29 @@ RSpec.describe JSONAPI::Serializer do .and(have_id(actor.movies[0].id)) .and(have_jsonapi_attributes('release_year').exactly) ) + expect(serialized['data']) + .to_not have_relationship('played_movies') + end + end + + context 'with fields for the relationship' do + let(:params) do + { + fields: { actor: [:first_name, :played_movies] } + } + end + + it do + expect(serialized['data']) + .to have_jsonapi_attributes(:first_name).exactly + + expect(serialized['data']) + .to have_relationship('played_movies') + .with_data( + [ + { 'id' => actor.movies[0].id, 'type' => 'movie' }, + ] + ) end end end