Sha256: 99c372593a1d7dacc04bb0af15c2d8e50da59a4e6e82e361effdb57b118372c6

Contents?: true

Size: 1.92 KB

Versions: 2

Compression:

Stored size: 1.92 KB

Contents

# frozen_string_literal: true

require 'activerecord-import'
require 'activerecord-import/base'
require "activerecord-import/active_record/adapters/#{ActiveReport.configuration.import_adapter}"
require 'json'

class ActiveReport::Record < ActiveReport::Base

  # rubocop:disable Metrics/PerceivedComplexity
  def export
    %i[except only].each { |key| @opts[key] = @opts[key].map(&:to_s) }

    if !@data.is_a?(ActiveRecord::Relation) && @data.try(:superclass) == ActiveRecord::Base
      @opts[:headers] = (@opts[:headers] || humanize_values(@data.column_names))

      @opts[:stream] ? export_stream : export_csv
    else
      @data = if @data.is_a?(ActiveRecord::Relation)
                JSON.parse(@data.to_json).flatten
              else
                merge(@data.attributes)
              end

      ActiveReport::Hash.export(@data, @opts)
    end
  end
  # rubocop:enable Metrics/PerceivedComplexity

  def import
    if @opts[:model].nil? || (@opts[:model].superclass != ActiveRecord::Base)
      raise ArgumentError,
            'Model must be an ActiveRecord::Base object.'
    end

    @data = ActiveReport::Hash.import(@data, headers: @opts[:headers], options: @opts[:options])
    @data = munge(@data)

    records = []
    @data.each do |data|
      params = {}

      data.each do |key, value|
        key = key.to_s.downcase.gsub(/ |-/, '_').to_sym
        params[key] = value
      end

      filter(params)
      params.delete(:id)
      records << params
    end

    @opts[:model].import(records, import_options)
  end

  private

  def export_csv
    CSV.generate(@opts[:options]) do |csv|
      csv << @opts[:headers]

      @data.find_each do |row|
        csv << filter_values(row.attributes)
      end
    end
  end

  def export_stream
    Enumerator.new do |csv|
      csv << CSV.generate_line(@opts[:headers])

      @data.find_each do |row|
        csv << CSV.generate_line(filter_values(row.attributes))
      end
    end
  end

end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
active_report-5.2.3 lib/active_report/record.rb
active_report-5.2.2 lib/active_report/record.rb