extinctionrebellion/RebelsManager

View on GitHub
app/services/csv_export.rb

Summary

Maintainability
A
0 mins
Test Coverage
F
0%
module CsvExport
  require 'csv'
  
  InvalidRecordsError = Class.new(StandardError)

  def self.for_model(records:, records_class:, context: nil)
    reportable_class = records_class
    records_are_all_active_record = reportable_class.ancestors.include?(ActiveRecord::Base) &&
      records.all? { |record| record.class == reportable_class }

    raise InvalidRecordsError unless records_are_all_active_record

    model_csv_generator_class = "#{self.name}::#{reportable_class}"
    model_csv_generator_class.constantize
                             .new(records, context)
                             .generate
  end

  class ExportGenerator
    def initialize(records, context = {})
      # transform in case is an ActiveRecord::Relation Object
      @records = records.to_a
      @context = context
    end

    def header
      raise 'define a header for the csv'
    end

    def extract_info
      raise 'define how to extract the data from the record'
    end

    def generate
      CSV.generate do |csv|
        csv << header

        @records.each do |record|
          csv << extract_info(record)
        end
      end
    end
  end
end