Class: ActAsImportable::Importer

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

Direct Known Subclasses

CSVImporter

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Importer

Returns a new instance of Importer.



4
5
6
7
8
# File 'lib/act_as_importable/importer.rb', line 4

def initialize(options = {})
  @default_options = options
  @imported_records = []
  @errors = []
end

Instance Method Details

#delete_missing_recordsObject



34
35
36
# File 'lib/act_as_importable/importer.rb', line 34

def delete_missing_records
  model_class.delete(record_ids_to_delete)
end

#existing_record_idsObject



25
26
27
# File 'lib/act_as_importable/importer.rb', line 25

def existing_record_ids
  existing_record_scope.map(&:id)
end

#existing_record_scopeObject



21
22
23
# File 'lib/act_as_importable/importer.rb', line 21

def existing_record_scope
  options[:existing_record_scope] || model_class.all
end

#failed_importsObject



68
69
70
71
# File 'lib/act_as_importable/importer.rb', line 68

def failed_imports
  # Note: We don't want to re-validate the objects.
  imported_records.reject { |r| r.errors.empty? }
end

#filter_columns(row) ⇒ Object



77
78
79
80
81
82
83
# File 'lib/act_as_importable/importer.rb', line 77

def filter_columns(row)
  except = Array(options[:except]).map { |i| i.to_s }
  only = Array(options[:only]).map { |i| i.to_s }
  row.reject! { |key, value| except.include? key.to_s } if except.present?
  row.select! { |key, value| only.include? key.to_s } if only.present?
  row
end

#import_data(data) ⇒ Object



14
15
16
17
18
19
# File 'lib/act_as_importable/importer.rb', line 14

def import_data(data)
  data.map do |row|
    import_record(row)
  end
  delete_missing_records if options[:delete_missing_records]
end

#import_record(row) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/act_as_importable/importer.rb', line 38

def import_record(row)
  row = prepare_row_for_import(row)
  record = find_or_create_record(row)
  record.update_attributes(row)
  record.save
  imported_records << record
  record
rescue Exception => e
  record = model_class.new
  # Assign the valid attributes (without saving)
  record.assign_attributes(row.select { |k,v| record.attributes.keys.include? k })
  record.errors.add :base, e.message
  record.import_data = row if record.respond_to? :import_data=
  imported_records << record
  record
end

#imported_recordsObject



59
60
61
# File 'lib/act_as_importable/importer.rb', line 59

def imported_records
  @imported_records ||= []
end

#missing_uid_values(row) ⇒ Object



55
56
57
# File 'lib/act_as_importable/importer.rb', line 55

def missing_uid_values(row)
  uid_values(row).select { |k, v| v.blank? }
end

#model_classObject



73
74
75
# File 'lib/act_as_importable/importer.rb', line 73

def model_class
  options[:model_class]
end

#optionsObject



10
11
12
# File 'lib/act_as_importable/importer.rb', line 10

def options
  @default_options
end

#record_ids_to_deleteObject



29
30
31
32
# File 'lib/act_as_importable/importer.rb', line 29

def record_ids_to_delete
  imported_ids = successful_imports.map(&:id)
  existing_record_ids.reject { |id| imported_ids.include? id }
end

#successful_importsObject



63
64
65
66
# File 'lib/act_as_importable/importer.rb', line 63

def successful_imports
  # Note: We don't want to re-validate the objects.
  imported_records.select { |r| r.errors.empty? }
end