Sha256: 94923512f32d06058c71eb071ad3ddf055e16c103494eb870a2aa600d8a14276

Contents?: true

Size: 1.29 KB

Versions: 1

Compression:

Stored size: 1.29 KB

Contents

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

    module ClassMethods
      def to_csv(opts={})
        fields = opts[:fields] || csv_fields
        scope = opts.delete(:i18n_scope)
        header = fields.map{|f|
          if scope
            I18n.t("#{scope}.#{f}", :default => human_attribute_name(f))
          else
            human_attribute_name(f)
          end
        }
        all.to_csv(opts.update(:fields => fields, :header => header))
      end

      def csv_fields
        if respond_to?(:attribute_names)
          attribute_names
        elsif self.is_a?(::ActiveRecord::Relation)
          @klass.new.attribute_names
        else
          new.attribute_names
        end
      end
    end

    module InstanceMethods
      def to_csv_ary(fields=nil, opts={})
        fields = attribute_names unless fields
        fields.map{|field|
          field.to_s.split(".").inject(self){|object, f|
            next unless object
            convert_method = "#{f}_as_csv"
            method = object.respond_to?(convert_method) ? convert_method : f
            object.send(method)
          }
        }
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
csv_rails-0.5.2 lib/csv_rails/active_record.rb