Report abuse


			
module ActiveSupport
  module CoreExtensions
    module Array
      module Conversions

        def to_csv(options=nil)
          raise ArgumentError unless all_elements_are?(first.class)
          str = ''
          CSV::Writer.generate(str) do |csv|
            # Get headers into right order based on options
            if options.nil?
              ordered_keys = sort_like(first.attributes(options).keys, first.class.column_names)
            else
              if options[:except] and options[:only]
                raise ArgumentError, "Options specify both :except and :only (#{options.keys.inspect})"
              elsif only = options[:only]
                ordered_keys = sort_like(first.attributes(options).keys, only)
              else
                raise ArgumentError, "Options does not specify :except or :only (#{options.keys.inspect})"             
              end
            end
            csv << ordered_keys
            each do | record |
              # Get values into right order
              ordered_values = []
              ordered_keys.each do |key|
                ordered_values << record.send(key)
              end
              csv << ordered_values
            end
          end 
          str
        end

        private

        def all_elements_are?(klass)
          self.inject(true) {|same, n| same && n.instance_of?(klass)}
        end

        def sort_like(array,order_model)
          array.sort_by { |record| order_model.index(record) || 0 }
        end

      end
    end
  end
end