@@ -153,6 +153,11 @@ def find_fragments(filters, options = {})
153153 pluck_fields << Arel . sql ( "#{ concat_table_field ( resource_table_alias , model_field [ :name ] ) } AS #{ resource_table_alias } _#{ model_field [ :name ] } " )
154154 end
155155
156+ sort_fields = options . dig ( :_relation_helper_options , :sort_fields )
157+ sort_fields . try ( :each ) do |field |
158+ pluck_fields << Arel . sql ( field )
159+ end
160+
156161 fragments = { }
157162 rows = records . pluck ( *pluck_fields )
158163 rows . each do |row |
@@ -445,6 +450,11 @@ def find_related_monomorphic_fragments(source_rids, relationship, options, conne
445450 pluck_fields << Arel . sql ( "#{ concat_table_field ( resource_table_alias , model_field [ :name ] ) } AS #{ resource_table_alias } _#{ model_field [ :name ] } " )
446451 end
447452
453+ sort_fields = options . dig ( :_relation_helper_options , :sort_fields )
454+ sort_fields . try ( :each ) do |field |
455+ pluck_fields << Arel . sql ( field )
456+ end
457+
448458 fragments = { }
449459 rows = records . distinct . pluck ( *pluck_fields )
450460 rows . each do |row |
@@ -680,24 +690,23 @@ def apply_request_settings_to_records(records:,
680690 paginator : nil ,
681691 options : { } )
682692
683- opts = options . dup
684- records = resource_klass . apply_joins ( records , join_manager , opts )
693+ options [ :_relation_helper_options ] = { join_manager : join_manager , sort_fields : [ ] }
694+
695+ records = resource_klass . apply_joins ( records , join_manager , options )
685696
686697 if primary_keys
687698 records = records . where ( _primary_key => primary_keys )
688699 end
689700
690- opts [ :join_manager ] = join_manager
691-
692701 unless filters . empty?
693- records = resource_klass . filter_records ( records , filters , opts )
702+ records = resource_klass . filter_records ( records , filters , options )
694703 end
695704
696705 if sort_primary
697706 records = records . order ( _primary_key => :asc )
698707 else
699708 order_options = resource_klass . construct_order_options ( sort_criteria )
700- records = resource_klass . sort_records ( records , order_options , opts )
709+ records = resource_klass . sort_records ( records , order_options , options )
701710 end
702711
703712 if paginator
@@ -731,12 +740,16 @@ def apply_single_sort(records, field, direction, options)
731740
732741 strategy = _allowed_sort . fetch ( field . to_sym , { } ) [ :apply ]
733742
743+ options [ :_relation_helper_options ] ||= { }
744+ options [ :_relation_helper_options ] [ :sort_fields ] ||= [ ]
745+
734746 if strategy
735747 records = call_method_or_proc ( strategy , records , direction , context )
736748 else
737- join_manager = options [ :join_manager ]
738-
739- records = records . order ( Arel . sql ( "#{ get_aliased_field ( field , join_manager ) } #{ direction } " ) )
749+ join_manager = options . dig ( :_relation_helper_options , :join_manager )
750+ sort_field = join_manager ? get_aliased_field ( field , join_manager ) : field
751+ options [ :_relation_helper_options ] [ :sort_fields ] . push ( "#{ sort_field } " )
752+ records = records . order ( Arel . sql ( "#{ sort_field } #{ direction } " ) )
740753 end
741754 records
742755 end
@@ -825,8 +838,9 @@ def apply_filter(records, filter, value, options = {})
825838 if strategy
826839 records = call_method_or_proc ( strategy , records , value , options )
827840 else
828- join_manager = options [ :join_manager ]
829- records = records . where ( Arel . sql ( get_aliased_field ( filter , join_manager ) ) => value )
841+ join_manager = options . dig ( :_relation_helper_options , :join_manager )
842+ field = join_manager ? get_aliased_field ( filter , join_manager ) : filter
843+ records = records . where ( Arel . sql ( field ) => value )
830844 end
831845
832846 records
0 commit comments