def result_to_xml(result, options = {}, &block)
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[:nested] = true unless options.key?(:nested)
options[:except] ||= []
[:left_column, :right_column, :parent_column].each do |opt|
column = acts_as_nested_set_options[opt].intern
options[:except] << column unless options[:except].include?(column)
end
options[:indent] ||= 2
options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:indent])
options[:builder].instruct! unless options.delete(:skip_instruct)
record = options.delete(:record)
root = options.delete(:root) || :nodes
children = options.delete(:children) || :children
attrs = {}
attrs[:xmlns] = options[:namespace] if options[:namespace]
siblings = options[:nested] ? result_set.select { |s| s.parent_id == parent_id } : result_set
options[:builder].tag!(root, attrs) do
siblings.each do |sibling|
result_set.delete(sibling) if options[:nested]
procs = options[:procs] ? options[:procs].dup : []
procs << Proc.new { |opts| block.call(opts, sibling) } if block_given?
if options[:nested]
proc = Proc.new do |opts|
proc_opts = opts.merge(:parent_id => sibling.id, :root => children, :record => record, :inner_recursion => true)
proc_opts[:procs] ||= options[:procs] if options[:procs]
proc_opts[:methods] ||= options[:methods] if options[:methods]
sibling.class.result_to_xml(result_set, proc_opts, &block)
end
procs << proc
end
opts = options.merge(:procs => procs, :skip_instruct => true, :root => record)
sibling.to_xml(opts)
end
end
options[:builder].target!
end