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