Skip to content

Commit 2aa4cd1

Browse files
authored
Merge pull request #205 from koya1616/fix/table-metadata-compatibility
Fix TableMetadata initialization for Rails 8 compatibility
2 parents d8377a9 + 1f83c3c commit 2aa4cd1

File tree

1 file changed

+40
-28
lines changed

1 file changed

+40
-28
lines changed

lib/motor/active_record_utils/active_record_filter.rb

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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
380392
end

0 commit comments

Comments
 (0)