Skip to content

Commit da2c379

Browse files
committed
Add SQL conversion method for Arel AST and optimize child adoption in hierarchy
1 parent 663c2a9 commit da2c379

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

lib/closure_tree/arel_helpers.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,5 +79,13 @@ def build_hierarchy_delete_query(hierarchy_table, id)
7979

8080
delete_manager
8181
end
82+
83+
# Convert an Arel AST to SQL using the correct connection's visitor
84+
# This ensures proper quoting for the specific database adapter (MySQL uses backticks, PostgreSQL uses double quotes)
85+
def to_sql_with_connection(arel_manager)
86+
collector = Arel::Collectors::SQLString.new
87+
visitor = connection.send(:arel_visitor)
88+
visitor.accept(arel_manager.ast, collector).value
89+
end
8290
end
8391
end

lib/closure_tree/hierarchy_maintenance.rb

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,13 @@ def adopt_children_to_grandparent
6363
grandparent_id = read_attribute(_ct.parent_column_name)
6464
children_ids = self.class.where(_ct.parent_column_name => id).pluck(:id)
6565

66-
children_ids.each do |child_id|
67-
child = self.class.find(child_id)
68-
child.update_column(_ct.parent_column_name, grandparent_id)
69-
child.rebuild!
70-
end
66+
return if children_ids.empty?
67+
68+
# Update all children's parent_id in a single query
69+
self.class.where(id: children_ids).update_all(_ct.parent_column_name => grandparent_id)
70+
71+
# Rebuild hierarchy for each child
72+
self.class.where(id: children_ids).find_each(&:rebuild!)
7173
end
7274

7375
def rebuild!(called_by_rebuild = false)
@@ -105,7 +107,7 @@ def delete_hierarchy_references
105107

106108
hierarchy_table = hierarchy_class.arel_table
107109
delete_query = _ct.build_hierarchy_delete_query(hierarchy_table, id)
108-
_ct.connection.execute(delete_query.to_sql)
110+
_ct.connection.execute(_ct.to_sql_with_connection(delete_query))
109111
end
110112
end
111113

0 commit comments

Comments
 (0)