def recurse_result_set(result, options = {}, &block)
return result unless block_given?
inner_recursion = options.delete(:inner_recursion)
result_set = inner_recursion ? result : result.dup
parent_id = (options.delete(:parent_id) || result_set.first[result_set.first.parent_col_name]) rescue nil
options[:level] ||= 0
options[:nested] = true unless options.key?(:nested)
siblings = options[:nested] ? result_set.select { |s| s.parent_id == parent_id } : result_set
siblings.sort! {|a,b| a.send(options[:sort_on]) <=> b.send(options[:sort_on])} if options[:sort_on]
siblings.each do |sibling|
result_set.delete(sibling)
block.call(sibling, options[:level])
opts = { :parent_id => sibling.id, :level => options[:level] + 1, :inner_recursion => true, :sort_on => options[:sort_on]}
recurse_result_set(result_set, opts, &block) if options[:nested]
end
result_set.each { |orphan| block.call(orphan, options[:level]) } unless inner_recursion
end