diff --git a/app/services/forest_liana/base_getter.rb b/app/services/forest_liana/base_getter.rb index 52e02530..b72023f7 100644 --- a/app/services/forest_liana/base_getter.rb +++ b/app/services/forest_liana/base_getter.rb @@ -19,12 +19,11 @@ def includes_for_serialization def compute_includes @includes = ForestLiana::QueryHelper.get_one_association_names_symbol(@resource) - @optional_includes = [] end def optimize_record_loading(resource, records, force_preload = true) polymorphic, preload_loads = analyze_associations(resource) - result = records.eager_load(@includes.uniq - preload_loads - polymorphic - @optional_includes) + result = records.eager_load(@includes.uniq - preload_loads - polymorphic) result = result.preload(preload_loads) if Rails::VERSION::MAJOR >= 7 && force_preload diff --git a/app/services/forest_liana/has_many_getter.rb b/app/services/forest_liana/has_many_getter.rb index bc189dcf..849bc962 100644 --- a/app/services/forest_liana/has_many_getter.rb +++ b/app/services/forest_liana/has_many_getter.rb @@ -37,8 +37,6 @@ def records private def compute_includes - @optional_includes = [] - @includes = @association.klass .reflect_on_all_associations .select do |association| diff --git a/app/services/forest_liana/resources_getter.rb b/app/services/forest_liana/resources_getter.rb index d39183de..2b9fd1c4 100644 --- a/app/services/forest_liana/resources_getter.rb +++ b/app/services/forest_liana/resources_getter.rb @@ -31,7 +31,7 @@ def self.get_ids_from_request(params, user) def perform polymorphic_association, preload_loads = analyze_associations(@resource) - includes = @includes.uniq - polymorphic_association - preload_loads - @optional_includes + includes = @includes.uniq - polymorphic_association - preload_loads has_smart_fields = Array(@params.dig(:fields, @collection_name)&.split(',')).any? do |field| ForestLiana::SchemaHelper.is_smart_field?(@resource, field) end @@ -136,20 +136,22 @@ def columns_for_cross_database_association(association_name) end def compute_includes - associations_has_one = ForestLiana::QueryHelper.get_one_associations(@resource) - - @optional_includes = [] + associations = ForestLiana::QueryHelper.get_one_associations(@resource) + required_relations = [] if @field_names_requested && @params['searchExtended'].to_i != 1 - includes = associations_has_one.map do |association| - association_name = association.name.to_s + has_smart_fields = Array(@params.dig(:fields, @collection_name)&.split(',')).any? do |field| + ForestLiana::SchemaHelper.is_smart_field?(@resource, field) + end + associations.map do |association| + association_name = association.name.to_s fields = @params[:fields]&.[](association_name)&.split(',') - if fields&.size == 1 && fields.include?(association.klass.primary_key) - @field_names_requested << association.foreign_key - @optional_includes << association.name - end - association.name + if fields&.size == 1 && fields.include?(association.klass.primary_key) || has_smart_fields + @field_names_requested << association.foreign_key if association.foreign_key.present? + required_relations << association.options[:through] if association.options[:through].present? + required_relations << association.name + end end includes_for_smart_search = [] @@ -165,9 +167,9 @@ def compute_includes includes_for_smart_search = includes_for_smart_search & includes_has_many end - @includes = (includes & @field_names_requested).concat(includes_for_smart_search) + @includes = required_relations.concat(includes_for_smart_search).uniq else - @includes = associations_has_one + @includes = associations # Avoid eager loading has_one associations pointing to a different database as ORM can't join cross databases .reject { |association| separate_database?(@resource, association) } .map(&:name)