Sha256: 87b6658cd97ebc76c9fb41a4290eaa6ef933980c62fe326ef6ad17fc54652153

Contents?: true

Size: 1.38 KB

Versions: 1

Compression:

Stored size: 1.38 KB

Contents

require 'csv'
module ActiveRecord
  module Acts
    module Csv
      def self.included(base)
        base.extend ClassMethods
        ::ActiveRecord::Relation.send(:include, ClassMethods)
        base.send(:include, InstanceMethods)
      end

      module ClassMethods
        def to_csv(opts={})
          fields = if opts[:fields]
                     opts.delete(:fields)
                   elsif respond_to?(:attribute_names)
                     attribute_names
                   elsif self.is_a?(ActiveRecord::Relation)
                     @klass.new.attribute_names
                   else
                     new.attribute_names
                   end
          CSV.generate do |csv|
            csv << fields.map{|f|
              name = human_attribute_name(f)
              opts[:encoding] ? name.encode(opts[:encoding]) : name
            } unless opts[:without_header]
            all.each{|row| csv << row.to_csv_ary(fields) }
          end
        end
      end

      module InstanceMethods
        def to_csv_ary(fields=nil, opts={})
          fields = attribute_names unless fields
          fields.map{|field|
            convert_method = "#{field}_as_csv"
            method = respond_to?(convert_method) ? convert_method : field
            value = send(method)
            opts[:encoding] ? value.to_s.encode(opts[:encoding]) : value
          }
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
csv_rails-0.4.0 lib/active_record/acts/csv.rb