Skip to content

Commit

Permalink
add with_connection to support Rails 7.2 and load it only for for 7.1+
Browse files Browse the repository at this point in the history
  • Loading branch information
gregmolnar committed Jul 10, 2024
1 parent 9811651 commit 0b73eef
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 0 deletions.
55 changes: 55 additions & 0 deletions lib/polyamorous/activerecord/join_association_7_2.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
module Polyamorous
module JoinAssociationExtensions
# Same as #join_constraints, but instead of constructing tables from the
# given block, uses the ones passed
def join_constraints_with_tables(foreign_table, foreign_klass, join_type, alias_tracker, tables)
joins = []
chain = []

reflection.chain.each.with_index do |reflection, i|
table = tables[i]

@table ||= table
chain << [reflection, table]
end

base_klass.with_connection do |connection|
# The chain starts with the target table, but we want to end with it here (makes
# more sense in this context), so we reverse
chain.reverse_each do |reflection, table|
klass = reflection.klass

join_scope = reflection.join_scope(table, foreign_table, foreign_klass)

unless join_scope.references_values.empty?
join_dependency = join_scope.construct_join_dependency(
join_scope.eager_load_values | join_scope.includes_values, Arel::Nodes::OuterJoin
)
join_scope.joins!(join_dependency)
end

arel = join_scope.arel(alias_tracker.aliases)
nodes = arel.constraints.first

if nodes.is_a?(Arel::Nodes::And)
others = nodes.children.extract! do |node|
!Arel.fetch_attribute(node) { |attr| attr.relation.name == table.name }
end
end

joins << table.create_join(table, table.create_on(nodes), join_type)

if others && !others.empty?
joins.concat arel.join_sources
append_constraints(connection, joins.last, others)
end

# The current table in this iteration becomes the foreign table in the next
foreign_table, foreign_klass = table, klass
end

joins
end
end
end
end
4 changes: 4 additions & 0 deletions lib/polyamorous/polyamorous.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ module Polyamorous
require 'polyamorous/activerecord/join_dependency'
require 'polyamorous/activerecord/reflection'

if ::ActiveRecord.version > ::Gem::Version.new("7.1")
require "polyamorous/activerecord/join_association_7_2"
end

ActiveRecord::Reflection::AbstractReflection.send(:prepend, Polyamorous::ReflectionExtensions)

Polyamorous::JoinDependency.send(:prepend, Polyamorous::JoinDependencyExtensions)
Expand Down

0 comments on commit 0b73eef

Please sign in to comment.