diff --git a/app/serializers/forest_liana/serializer_factory.rb b/app/serializers/forest_liana/serializer_factory.rb index d795da96..b3f9105e 100644 --- a/app/serializers/forest_liana/serializer_factory.rb +++ b/app/serializers/forest_liana/serializer_factory.rb @@ -139,10 +139,10 @@ def has_one_relationships next if !should_include_attr?(attribute_name, attr_data) - unless relation.polymorphic? + unless relation.nil? || (relation.respond_to?(:polymorphic?) && relation.polymorphic?) relation_class_name = ForestLiana.name_for(relation.klass).demodulize - if object.send(relation.foreign_key.to_sym) && + if object.respond_to?(relation.foreign_key.to_sym) && @options[:fields][relation_class_name]&.size == 1 && @options[:fields][relation_class_name]&.include?(relation.klass.primary_key.to_sym) diff --git a/app/services/forest_liana/resources_getter.rb b/app/services/forest_liana/resources_getter.rb index 8ad42547..63e0348f 100644 --- a/app/services/forest_liana/resources_getter.rb +++ b/app/services/forest_liana/resources_getter.rb @@ -56,10 +56,22 @@ def query_for_batch def records records = @records.offset(offset).limit(limit).to_a - polymorphic_association, preload_loads = analyze_associations(@resource) + if polymorphic_association && Rails::VERSION::MAJOR >= 7 - # TODO + preloader = ActiveRecord::Associations::Preloader.new(records: records, associations: polymorphic_association) + preloader.loaders + preloader.branches.each do |branch| + branch.loaders.each do |loader| + records_by_owner = loader.records_by_owner + records_by_owner.each do |record, association| + record_index = records.find_index { |r| r.id == record.id } + records[record_index].define_singleton_method(branch.association) do + association.first + end + end + end + end end preload_cross_database_associations(records, preload_loads)