From d3b9de0bab71ba1ca47d2dd57d0a9b05e01bcc8b Mon Sep 17 00:00:00 2001 From: Grant Paulson Date: Mon, 17 May 2021 13:05:24 -0700 Subject: [PATCH] Allow for a single associated record that is enumerable. Example: A Struct. Ideally we could still serialize an associated single record if it is a Struct. --- lib/fast_jsonapi/relationship.rb | 2 +- lib/fast_jsonapi/serialization_core.rb | 2 +- spec/fixtures/debut.rb | 7 +++++++ spec/fixtures/movie.rb | 5 ++++- spec/integration/relationships_spec.rb | 11 +++++++++++ 5 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 spec/fixtures/debut.rb diff --git a/lib/fast_jsonapi/relationship.rb b/lib/fast_jsonapi/relationship.rb index 4a36932..6295be4 100644 --- a/lib/fast_jsonapi/relationship.rb +++ b/lib/fast_jsonapi/relationship.rb @@ -107,7 +107,7 @@ module FastJsonapi return unless associated_object = fetch_associated_object(record, params) - if associated_object.respond_to? :map + if associated_object.respond_to? :to_ary return associated_object.map do |object| id_hash_from_record object, params end diff --git a/lib/fast_jsonapi/serialization_core.rb b/lib/fast_jsonapi/serialization_core.rb index 4931fa7..59970bd 100644 --- a/lib/fast_jsonapi/serialization_core.rb +++ b/lib/fast_jsonapi/serialization_core.rb @@ -172,7 +172,7 @@ module FastJsonapi next unless relationship_item&.include_relationship?(record, params) - included_objects = Array(relationship_item.fetch_associated_object(record, params)) + included_objects = Array.wrap(relationship_item.fetch_associated_object(record, params)) next if included_objects.empty? static_serializer = relationship_item.static_serializer diff --git a/spec/fixtures/debut.rb b/spec/fixtures/debut.rb new file mode 100644 index 0000000..0813af6 --- /dev/null +++ b/spec/fixtures/debut.rb @@ -0,0 +1,7 @@ +Debut = Struct.new(:id, :location) + +class DebutSerializer + include JSONAPI::Serializer + + attributes :location +end diff --git a/spec/fixtures/movie.rb b/spec/fixtures/movie.rb index f99af21..c084447 100644 --- a/spec/fixtures/movie.rb +++ b/spec/fixtures/movie.rb @@ -8,7 +8,8 @@ class Movie :actor_ids, :polymorphics, :owner, - :owner_id + :owner_id, + :debut ) def self.fake(id = nil) @@ -104,6 +105,8 @@ class MovieSerializer ) do |obj| obj.polymorphics end + + has_one(:debut) { |obj| obj.debut } end module Cached diff --git a/spec/integration/relationships_spec.rb b/spec/integration/relationships_spec.rb index f0585a8..56355b2 100644 --- a/spec/integration/relationships_spec.rb +++ b/spec/integration/relationships_spec.rb @@ -9,6 +9,7 @@ RSpec.describe JSONAPI::Serializer do poly_act.movies = [Movie.fake] mov.polymorphics = [User.fake, poly_act] mov.actor_or_user = Actor.fake + mov.debut = Debut.new(SecureRandom.uuid, 'Los Angeles') mov end let(:params) { {} } @@ -141,6 +142,16 @@ RSpec.describe JSONAPI::Serializer do ) end end + + context 'with enumerable data types' do + let(:params) do + { include: [:debut] } + end + + it do + expect(serialized['included']).to include(have_type('debut').and(have_id(movie.debut.id))) + end + end end end end