def result_to_attributes_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
level = options[:level] || 0
options[:methods] ||= []
options[:nested] = true unless options.key?(:nested)
options[:dasherize] = true unless options.key?(:dasherize)
if options[:only].blank? && options[:except].blank?
options[:except] = [:left_column, :right_column, :parent_column].inject([]) do |ex, opt|
column = acts_as_nested_set_options[opt].to_sym
ex << column unless ex.include?(column)
ex
end
end
options[:indent] ||= 2
options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:indent])
options[:builder].instruct! unless options.delete(:skip_instruct)
parent_attrs = {}
parent_attrs[:xmlns] = options[:namespace] if options[:namespace]
siblings = options[:nested] ? result_set.select { |s| s.parent_id == parent_id } : result_set
siblings.each do |sibling|
result_set.delete(sibling)
node_tag = (options[:record] || sibling[sibling.class.inheritance_column] || 'node').underscore
node_tag = node_tag.dasherize unless options[:dasherize]
attrs = block_given? ? block.call(sibling, level) : sibling.attributes(:only => options[:only], :except => options[:except])
options[:methods].inject(attrs) { |enum, m| enum[m.to_s] = sibling.send(m) if sibling.respond_to?(m); enum }
if options[:nested] && sibling.children?
opts = options.merge(:parent_id => sibling.id, :level => level + 1, :inner_recursion => true, :skip_instruct => true)
options[:builder].tag!(node_tag, attrs) { result_to_attributes_xml(result_set, opts, &block) }
else
options[:builder].tag!(node_tag, attrs)
end
end
unless inner_recursion
result_set.each do |orphan|
node_tag = (options[:record] || orphan[orphan.class.inheritance_column] || 'node').underscore
node_tag = node_tag.dasherize unless options[:dasherize]
attrs = block_given? ? block.call(orphan, level) : orphan.attributes(:only => options[:only], :except => options[:except])
options[:methods].inject(attrs) { |enum, m| enum[m.to_s] = orphan.send(m) if orphan.respond_to?(m); enum }
options[:builder].tag!(node_tag, attrs)
end
end
options[:builder].target!
end