Class: ActiveAdminImport::Importer

Inherits:
Object
  • Object
show all
Defined in:
lib/active_admin_import/importer.rb

Constant Summary collapse

OPTIONS =
[
  :validate,
  :on_duplicate_key_update,
  :on_duplicate_key_ignore,
  :ignore,
  :timestamps,
  :before_import,
  :after_import,
  :before_batch_import,
  :after_batch_import,
  :headers_rewrites,
  :batch_size,
  :batch_transaction,
  :csv_options,
  :result_class
].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(resource, model, options) ⇒ Importer

Returns a new instance of Importer.



25
26
27
28
29
30
# File 'lib/active_admin_import/importer.rb', line 25

def initialize(resource, model, options)
  @resource = resource
  @model = model
  @headers = model.respond_to?(:csv_headers) ? model.csv_headers : []
  assign_options(options)
end

Instance Attribute Details

#csv_linesObject

Returns the value of attribute csv_lines.



6
7
8
# File 'lib/active_admin_import/importer.rb', line 6

def csv_lines
  @csv_lines
end

#headersObject

Returns the value of attribute headers.



6
7
8
# File 'lib/active_admin_import/importer.rb', line 6

def headers
  @headers
end

#modelObject (readonly)

Returns the value of attribute model.



5
6
7
# File 'lib/active_admin_import/importer.rb', line 5

def model
  @model
end

#optionsObject (readonly)

Returns the value of attribute options.



5
6
7
# File 'lib/active_admin_import/importer.rb', line 5

def options
  @options
end

#resourceObject (readonly)

Returns the value of attribute resource.



5
6
7
# File 'lib/active_admin_import/importer.rb', line 5

def resource
  @resource
end

#resultObject (readonly)

Returns the value of attribute result.



5
6
7
# File 'lib/active_admin_import/importer.rb', line 5

def result
  @result
end

Instance Method Details

#batch_replace(header_key, options) ⇒ Object



65
66
67
68
69
70
71
72
# File 'lib/active_admin_import/importer.rb', line 65

def batch_replace(header_key, options)
  index = header_index(header_key)
  csv_lines.map! do |line|
    from = line[index]
    line[index] = options[from] if options.key?(from)
    line
  end
end

#batch_slice_columns(slice_columns) ⇒ Object

Use this method when CSV file contains unnecessary columns

Example:

ActiveAdmin.register Post

active_admin_import before_batch_import: lambda { |importer|
                      importer.batch_slice_columns(['name', 'birthday'])
                    }

end



84
85
86
87
88
89
90
91
92
93
94
# File 'lib/active_admin_import/importer.rb', line 84

def batch_slice_columns(slice_columns)
  columns = headers.values
  indexes = columns.each_index.select { |i| columns[i].in?(slice_columns) }
  return csv_lines if indexes.empty?

  # @headers is reset to the full set at the start of every batch (see
  # #batch_import), so each call narrows the previous call's result and every
  # batch slices the same way — calling this more than once now composes (#186).
  @headers = headers.to_a.values_at(*indexes).to_h
  csv_lines.map! { |line| line.values_at(*indexes) }
end

#cycle(lines) ⇒ Object



40
41
42
43
# File 'lib/active_admin_import/importer.rb', line 40

def cycle(lines)
  @csv_lines = CSV.parse(lines.join, **@csv_options)
  import_result.add(batch_import, lines.count)
end

#fileObject



36
37
38
# File 'lib/active_admin_import/importer.rb', line 36

def file
  @model.file
end

#header_index(header_key) ⇒ Object



100
101
102
# File 'lib/active_admin_import/importer.rb', line 100

def header_index(header_key)
  headers.values.index(header_key)
end

#importObject



45
46
47
48
49
50
# File 'lib/active_admin_import/importer.rb', line 45

def import
  run_callback(:before_import)
  process_file
  run_callback(:after_import)
  import_result
end

#import_optionsObject



52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/active_admin_import/importer.rb', line 52

def import_options
  @import_options ||= options.slice(
    :validate,
    :validate_uniqueness,
    :on_duplicate_key_update,
    :on_duplicate_key_ignore,
    :ignore,
    :timestamps,
    :batch_transaction,
    :batch_size
  )
end

#import_resultObject



32
33
34
# File 'lib/active_admin_import/importer.rb', line 32

def import_result
  @import_result ||= (options[:result_class] || ImportResult).new
end

#values_at(header_key) ⇒ Object



96
97
98
# File 'lib/active_admin_import/importer.rb', line 96

def values_at(header_key)
  csv_lines.collect { |line| line[header_index(header_key)] }.uniq
end