@@ -340,41 +340,53 @@ def expand_filter_for_relationship(relation, value, relation_trail, alias_tracke
340340 if relation . polymorphic?
341341 value = value . dup
342342 klass = value . delete ( :as ) . safe_constantize
343+ new_trail = relation_trail + [ "#{ klass . table_name } _as_#{ relation . name } " ]
343344
344- builder = self . class . new ( TableMetadata . new (
345- klass ,
346- alias_tracker . aliased_table_for_relation ( relation_trail + [ "#{ klass . table_name } _as_#{ relation . name } " ] ,
347- klass . arel_table ) do
348- klass . arel_table . name
349- end ,
350- relation
351- ) )
352- builder . build_from_filter_hash ( value , relation_trail + [ "#{ klass . table_name } _as_#{ relation . name } " ] ,
353- alias_tracker )
345+ arel_table = alias_tracker . aliased_table_for_relation ( new_trail , klass . arel_table ) do
346+ klass . arel_table . name
347+ end
348+
349+ metadata = build_table_metadata ( klass , arel_table , relation )
350+ builder = self . class . new ( metadata )
351+ builder . build_from_filter_hash ( value , new_trail , alias_tracker )
354352 else
355- builder = self . class . new ( TableMetadata . new (
356- relation . klass ,
357- alias_tracker . aliased_table_for_relation ( relation_trail + [ relation . name ] ,
358- relation . klass . arel_table ) do
359- relation . alias_candidate ( table . arel_table . name || relation . klass . arel_table )
360- end ,
361- relation
362- ) )
363- builder . build_from_filter_hash ( value , relation_trail + [ relation . name ] , alias_tracker )
353+ new_trail = relation_trail + [ relation . name ]
354+
355+ arel_table = alias_tracker . aliased_table_for_relation ( new_trail , relation . klass . arel_table ) do
356+ relation . alias_candidate ( table . arel_table . name || relation . klass . arel_table )
357+ end
358+
359+ metadata = build_table_metadata ( relation . klass , arel_table , relation )
360+ builder = self . class . new ( metadata )
361+ builder . build_from_filter_hash ( value , new_trail , alias_tracker )
364362 end
365363 end
366364
367365 def expand_filter_for_join_table ( relation , value , relation_trail , alias_tracker )
368366 relation = relation . active_record . _reflections [ relation . active_record . _reflections [ relation . name . to_s ] . send ( :delegate_reflection ) . options [ :through ] . to_s ]
369- builder = self . class . new ( TableMetadata . new (
370- relation . klass ,
371- alias_tracker . aliased_table_for_relation ( relation_trail + [ relation . name ] ,
372- relation . klass . arel_table ) do
373- relation . alias_candidate ( table . arel_table . name || relation . klass . arel_table )
374- end ,
375- relation
376- ) )
377- builder . build_from_filter_hash ( value , relation_trail + [ relation . name ] , alias_tracker )
367+ new_trail = relation_trail + [ relation . name ]
368+
369+ arel_table = alias_tracker . aliased_table_for_relation ( new_trail , relation . klass . arel_table ) do
370+ relation . alias_candidate ( table . arel_table . name || relation . klass . arel_table )
371+ end
372+
373+ metadata = build_table_metadata ( relation . klass , arel_table , relation )
374+ builder = self . class . new ( metadata )
375+ builder . build_from_filter_hash ( value , new_trail , alias_tracker )
376+ end
377+
378+ private
379+
380+ def build_table_metadata ( klass , arel_table , reflection = nil )
381+ if table_metadata_supports_reflection?
382+ ::ActiveRecord ::TableMetadata . new ( klass , arel_table , reflection )
383+ else
384+ ::ActiveRecord ::TableMetadata . new ( klass , arel_table )
385+ end
386+ end
387+
388+ def table_metadata_supports_reflection?
389+ @table_metadata_supports_reflection ||= ::ActiveRecord ::TableMetadata . instance_method ( :initialize ) . arity != 2
378390 end
379391 end
380392end
0 commit comments