Use arel_table directly instead of newly created table

This commit is contained in:
Ryuta Kamizono 2020-07-23 21:18:16 +09:00
parent 3af558e991
commit 43b83955a2
4 changed files with 17 additions and 23 deletions

@ -51,25 +51,23 @@ def initialize(connection, aliases)
@connection = connection
end
def aliased_table_for(table_name, aliased_name, klass)
if aliases[table_name].zero?
def aliased_table_for(arel_table)
if aliases[arel_table.name] == 0
# If it's zero, we can have our table_name
aliases[table_name] = 1
Arel::Table.new(table_name, klass: klass)
aliases[arel_table.name] = 1
else
# Otherwise, we need to use an alias
aliased_name = @connection.table_alias_for(aliased_name)
aliased_name = @connection.table_alias_for(yield)
# Update the count
aliases[aliased_name] += 1
count = aliases[aliased_name] += 1
table_alias = if aliases[aliased_name] > 1
"#{truncate(aliased_name)}_#{aliases[aliased_name]}"
else
aliased_name
end
Arel::Table.new(table_name, klass: klass).alias(table_alias)
aliased_name = "#{truncate(aliased_name)}_#{count}" if count > 1
arel_table = arel_table.alias(aliased_name)
end
arel_table
end
attr_reader :aliases

@ -106,11 +106,9 @@ def get_chain(reflection, association, tracker)
name = reflection.name
chain = [Reflection::RuntimeReflection.new(reflection, association)]
reflection.chain.drop(1).each do |refl|
aliased_table = tracker.aliased_table_for(
refl.table_name,
refl.alias_candidate(name),
refl.klass
)
aliased_table = tracker.aliased_table_for(refl.klass.arel_table) do
refl.alias_candidate(name)
end
chain << ReflectionProxy.new(refl, aliased_table)
end
chain

@ -173,11 +173,9 @@ def make_constraints(parent, child, join_type)
foreign_table = parent.table
foreign_klass = parent.base_klass
child.join_constraints(foreign_table, foreign_klass, join_type, alias_tracker) do |reflection|
alias_tracker.aliased_table_for(
reflection.table_name,
table_alias_for(reflection, parent, reflection != child.reflection),
reflection.klass
)
alias_tracker.aliased_table_for(reflection.klass.arel_table) do
table_alias_for(reflection, parent, reflection != child.reflection)
end
end.concat child.children.flat_map { |c| make_constraints(child, c, join_type) }
end

@ -1052,7 +1052,7 @@ def klass
end
def aliased_table
@aliased_table ||= Arel::Table.new(table_name, klass: klass)
klass.arel_table
end
def join_primary_key(klass = self.klass)