Sha256: 98463293d0fe2a70fd09f91ba08815469956e616ed83e1b889afbe89c50525e9

Contents?: true

Size: 1.95 KB

Versions: 1

Compression:

Stored size: 1.95 KB

Contents

# frozen_string_literal: true

require 'active_record' unless defined?(ActiveRecord)

class Lite::Report::Record < Lite::Report::Base

  def export
    assign_headers_to_csv_options!
    generate_or_stream_export!
  end

  def import
    assert_klass_data_option!
    assign_import_csv_options!

    @data = Lite::Report::Hash.import(@data, csv_options: @csv_options, data_options: @data_options)
                              .each do |row|
                                row.delete(:id) || row.delete('id')
                                (row['created_at'] ||= timestamp) if created_at_timestamp?
                                (row['updated_at'] ||= timestamp) if updated_at_timestamp?
                              end

    klass.insert_all(@data, **@import_options)
  end

  private

  def assert_klass_data_option!
    return if klass

    raise ArgumentError, '":klass" data_option is required'
  end

  def assign_headers_to_csv_options!
    return unless write_headers?

    @csv_options[:headers] ||= class_columns(@data)
  end

  def assign_import_csv_options!
    @csv_options[:headers] ||= class_columns(klass)
  end

  def assign_export_data!
    columns = class_columns(@data)
    @data = if ransack_class?(@data)
              @data.result
            elsif @data.try(:persisted?)
              Array(@data)
            else
              @data
            end

    @data = @data.pluck(*columns).map { |values| columns.zip(values).to_h }
  end

  def generate_export!
    assign_export_data!
    super
  end

  def stream_export!
    assign_export_data!
    super
  end

  def timestamp
    @timestamp ||= Time.try(:current) || Time.now
  end

  def created_at_timestamp?
    return @created_at_timestamp if defined?(@created_at_timestamp)

    @created_at_timestamp = klass.new.respond_to?(:created_at)
  end

  def updated_at_timestamp?
    return @updated_at_timestamp if defined?(@updated_at_timestamp)

    @updated_at_timestamp = klass.new.respond_to?(:updated_at)
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
lite-report-1.3.2 lib/lite/report/record.rb