def destroy_descendants
return if self[right_col_name].nil? || self[left_col_name].nil? || self.skip_before_destroy
reloaded = self.reload rescue nil
return unless reloaded
dif = self[right_col_name] - self[left_col_name] + 1
if acts_as_nested_set_options[:dependent] == :delete_all
base_set_class.delete_all( "#{scope_condition} AND (#{prefixed_left_col_name} BETWEEN #{self[left_col_name]} AND #{self[right_col_name]})" )
else
set = base_set_class.find(:all, :conditions => "#{scope_condition} AND (#{prefixed_left_col_name} BETWEEN #{self[left_col_name]} AND #{self[right_col_name]})", :order => "#{prefixed_right_col_name} DESC")
set.each { |child| child.skip_before_destroy = true; remove_descendant(child) }
end
base_set_class.update_all("#{left_col_name} = CASE \
WHEN #{left_col_name} > #{self[right_col_name]} THEN (#{left_col_name} - #{dif}) \
ELSE #{left_col_name} END, \
#{right_col_name} = CASE \
WHEN #{right_col_name} > #{self[right_col_name]} THEN (#{right_col_name} - #{dif} ) \
ELSE #{right_col_name} END",
scope_condition)
end