module RailsCsvRenderer::Renderable

Public Instance Methods

to_custom_csv(options = {}) click to toggle source

Converts an collection of active records to CSV formatted string Options is configuration set for generated CSV file

# File lib/rails_csv_renderer/renderable.rb, line 9
def to_custom_csv(options = {})
  csv_options = default_csv_options.merge(options[:csv_options] || {})

  if is_active_record?
    if !(model.respond_to?(:csv_header) || model.method_defined?(:csv_row)) || model.class_variable_defined?(:@@dynamic_generated_csv_methods)
      define_csv_methods(options)
    end
  end

  CSV.generate(csv_options) do |csv|
    if is_active_record?
      csv << model.csv_header
      self.each do |obj|
        csv << obj.csv_row
      end
    else
      csv << self if respond_to?(:to_csv)
    end
  end
end

Private Instance Methods

default_csv_options() click to toggle source
# File lib/rails_csv_renderer/renderable.rb, line 73
def default_csv_options
  { encoding: 'utf-8' }
end
define_csv_methods(options) click to toggle source
# File lib/rails_csv_renderer/renderable.rb, line 32
def define_csv_methods(options)
  columns = options[:columns] || model.column_names

  model.class_variable_set(:@@dynamic_generated_csv_methods, true)
  model.class_eval(%Q/
    class << self
      def csv_header
        ["#{ columns.map { |column_name| model.human_attribute_name(column_name) }.join('", "') }"]
      end
    end
  /)
  model.class_eval(%Q/
    def csv_row
     [#{ columns.join(', ') }]
   end
  /)
end
is_active_record?() click to toggle source
# File lib/rails_csv_renderer/renderable.rb, line 50
def is_active_record?
  is_a?(ActiveRecord::Relation) ||
  (present? && first.is_a?(ActiveRecord::Base)) ||
  try(:decorator_class).respond_to?(:column_names)
end
model() click to toggle source
# File lib/rails_csv_renderer/renderable.rb, line 56
def model
  if is_active_record?
    is_ar_array = ->(obj) { obj.present? && obj.first.is_a?(ActiveRecord::Base)}
    is_drapper_collection = ->(obj) { try(:decorator_class) }

    @model ||=
      case self
      when ActiveRecord::Relation
        klass
      when is_ar_array
        first.class
      when is_drapper_collection
        decorator_class
      end
  end
end