Sha256: 28593b06c79717b3d20835a988c22f8df9e47fc558cc67bdbb8c4ac776385ba9

Contents?: true

Size: 1.8 KB

Versions: 3

Compression:

Stored size: 1.8 KB

Contents

require 'json'
class ActiveReport::Record < ActiveReport::Base

  attr_accessor :datum, :model, :only, :except, :headers, :options

  def initialize(datum, model: nil, only: nil, except: nil, headers: nil, options: {})
    @datum = datum
    @except = except
    @headers = headers
    @model = model
    @only = only
    @options = duplicate_options.merge!(options)
  end

  def self.export(datum, only: nil, except: nil, headers: nil, options: {})
    new(datum, only: only, except: except, headers: headers, options: options).export
  end

  def self.import(datum, only: nil, except: nil, headers: nil, options: {}, model: nil)
    new(datum, only: only, except: except, headers: headers, options: options, model: model).import
  end

  def export
    @datum = if @datum.is_a?(ActiveRecord::Relation)
               JSON.parse(@datum.to_json).flatten
             else
               merge(@datum.attributes)
             end

    @only = munge(@only).map(&:to_s)
    @except = munge(@except).map(&:to_s)

    CSV.generate(@options) do |csv|
      csv << (@headers || (filter_first(@datum) || @datum.first).keys.map { |hdr| humanize(hdr) })
      @datum.lazy.each { |data| csv << (filter(data) || data).values }
    end
  end

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

    @datum = ActiveReport::Hash.import(@datum, headers: @headers, options: @options)
    @datum = munge(@datum)
    @only = munge(@only)
    @except = munge(@except)

    @datum.lazy.each do |data|
      params = {}
      data.each do |key, value|
        key = key.to_s.downcase.tr(' ', '_').tr('-', '_').to_sym
        params.store(key, value)
      end

      filter(params)
      params.delete(:id)
      @model.create(params)
    end
  end

end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
active_report-4.0.2 lib/active_report/record.rb
active_report-4.0.1 lib/active_report/record.rb
active_report-4.0.0 lib/active_report/record.rb