diff --git a/lib/fast_jsonapi/object_serializer.rb b/lib/fast_jsonapi/object_serializer.rb index afa6bb2..fa13add 100644 --- a/lib/fast_jsonapi/object_serializer.rb +++ b/lib/fast_jsonapi/object_serializer.rb @@ -130,6 +130,7 @@ module FastJsonapi subclass.cached = cached subclass.set_type(subclass.reflected_record_type) if subclass.reflected_record_type subclass.meta_to_serialize = meta_to_serialize + subclass.record_id = record_id end def reflected_record_type @@ -241,12 +242,15 @@ module FastJsonapi base_key_sym = name id_postfix = '_id' end + polymorphic = fetch_polymorphic_option(options) + Relationship.new( key: options[:key] || run_key_transform(base_key), name: name, id_method_name: compute_id_method_name( options[:id_method_name], "#{base_serialization_key}#{id_postfix}".to_sym, + polymorphic, block ), record_type: options[:record_type] || run_key_transform(base_key_sym), @@ -255,7 +259,7 @@ module FastJsonapi serializer: compute_serializer_name(options[:serializer] || base_key_sym), relationship_type: relationship_type, cached: options[:cached], - polymorphic: fetch_polymorphic_option(options), + polymorphic: polymorphic, conditional_proc: options[:if], transform_method: @transform_method, links: options[:links], @@ -263,8 +267,8 @@ module FastJsonapi ) end - def compute_id_method_name(custom_id_method_name, id_method_name_from_relationship, block) - if block.present? + def compute_id_method_name(custom_id_method_name, id_method_name_from_relationship, polymorphic, block) + if block.present? || polymorphic custom_id_method_name || :id else custom_id_method_name || id_method_name_from_relationship diff --git a/lib/fast_jsonapi/relationship.rb b/lib/fast_jsonapi/relationship.rb index 5f82843..12b5a1a 100644 --- a/lib/fast_jsonapi/relationship.rb +++ b/lib/fast_jsonapi/relationship.rb @@ -78,7 +78,7 @@ module FastJsonapi def id_hash_from_record(record, record_types) # memoize the record type within the record_types dictionary, then assigning to record_type: associated_record_type = record_types[record.class] ||= run_key_transform(record.class.name.demodulize.underscore) - id_hash(record.id, associated_record_type) + id_hash(record.public_send(id_method_name), associated_record_type) end def ids_hash(ids) diff --git a/spec/lib/object_serializer_inheritance_spec.rb b/spec/lib/object_serializer_inheritance_spec.rb index beb7487..8e1b0d7 100644 --- a/spec/lib/object_serializer_inheritance_spec.rb +++ b/spec/lib/object_serializer_inheritance_spec.rb @@ -20,7 +20,7 @@ describe FastJsonapi::ObjectSerializer do end class User - attr_accessor :id, :first_name, :last_name + attr_accessor :id, :first_name, :last_name, :uuid attr_accessor :address_ids, :country_id @@ -39,6 +39,7 @@ describe FastJsonapi::ObjectSerializer do class UserSerializer include FastJsonapi::ObjectSerializer set_type :user + set_id :uuid attributes :first_name, :last_name attribute :full_name do |user, params| @@ -125,6 +126,14 @@ describe FastJsonapi::ObjectSerializer do EmployeeSerializer expect(UserSerializer.attributes_to_serialize).not_to have_key(:location) end + + it 'inherits the id source' do + e = Employee.new + e.id = 2 + e.uuid = SecureRandom.uuid + id = EmployeeSerializer.new(e).serializable_hash[:data][:id] + expect(id).to eq(e.uuid) + end end context 'when testing inheritance of relationship' do @@ -158,11 +167,9 @@ describe FastJsonapi::ObjectSerializer do end context 'when test inheritence of other attributes' do - it 'inherits the tranform method' do EmployeeSerializer expect(UserSerializer.transform_method).to eq EmployeeSerializer.transform_method end - end end diff --git a/spec/lib/object_serializer_polymorphic_spec.rb b/spec/lib/object_serializer_polymorphic_spec.rb index f889141..253fbef 100644 --- a/spec/lib/object_serializer_polymorphic_spec.rb +++ b/spec/lib/object_serializer_polymorphic_spec.rb @@ -13,6 +13,10 @@ describe FastJsonapi::ObjectSerializer do attr_accessor :id, :model, :year end + class Animal + attr_accessor :id, :uuid, :species + end + class ListSerializer include FastJsonapi::ObjectSerializer set_type :list @@ -21,6 +25,13 @@ describe FastJsonapi::ObjectSerializer do has_many :items, polymorphic: true end + class ZooSerializer + include FastJsonapi::ObjectSerializer + set_type :list + attributes :name + has_many :items, polymorphic: true, id_method_name: :uuid + end + let(:car) do car = Car.new car.id = 1 @@ -36,6 +47,14 @@ describe FastJsonapi::ObjectSerializer do checklist_item end + let(:animal) do + animal = Animal.new + animal.id = 1 + animal.species = 'Mellivora capensis' + animal.uuid = SecureRandom.uuid + animal + end + context 'when serializing id and type of polymorphic relationships' do it 'should return correct type when transform_method is specified' do list = List.new @@ -47,5 +66,14 @@ describe FastJsonapi::ObjectSerializer do record_type = list_hash[:data][:relationships][:items][:data][1][:type] expect(record_type).to eq 'car'.to_sym end + + it 'should use the correct id method on associated objects' do + list = List.new + list.id = 1 + list.items = [animal] + list_hash = ZooSerializer.new(list).to_hash + id = list_hash[:data][:relationships][:items][:data][0][:id] + expect(id).to eq animal.uuid + end end end