Class: DataImportColumn

Inherits:
ApplicationRecord show all
Defined in:
app/models/data_import_column.rb

Overview

== Schema Information

Table name: data_import_columns
Database name: primary

id :integer not null, primary key
column_index :integer
name :string(255)
data_dictionary_set_id :integer
data_import_id :integer

Indexes

index_data_import_columns_on_data_import_id (data_import_id)

Foreign Keys

data_import_columns_data_import_id_fk (data_import_id => data_imports.id) ON DELETE => cascade
fk_rails_... (data_import_id => data_imports.id) ON DELETE => cascade

Belongs to collapse

Has many collapse

Instance Method Summary collapse

Methods inherited from ApplicationRecord

ransackable_associations, ransackable_attributes, ransackable_scopes, ransortable_attributes, #to_relation

Methods included from Models::EventPublishable

#publish_event

Instance Method Details

#data_dictionary_setDataDictionarySet



24
# File 'app/models/data_import_column.rb', line 24

belongs_to :data_dictionary_set, optional: true

#data_importDataImport

Returns:

See Also:



23
# File 'app/models/data_import_column.rb', line 23

belongs_to :data_import, inverse_of: :data_import_columns

#data_import_cellsActiveRecord::Relation<DataImportCell>

Returns:

See Also:



25
# File 'app/models/data_import_column.rb', line 25

has_many :data_import_cells, dependent: :destroy, inverse_of: :data_import_row

#expand_address(data_import_cell_ids: nil) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'app/models/data_import_column.rb', line 27

def expand_address(data_import_cell_ids: nil)
  #Prepare columns
  country_iso_to_iso3_map = Country.iso_to_iso3_map
  
  # last column index
  col_index = data_import.data_import_columns.maximum(:column_index) || 0
  
  dds_address_line_1 = DataDictionarySet.find_by(default_set: true, destination: 'billing_address.street1')
  dic_address_line_1 = data_import.data_import_columns.where(name: 'address_line_1').first_or_create(column_index: (col_index += 1), data_dictionary_set_id: dds_address_line_1.id)
  
  dds_address_line_2 = DataDictionarySet.find_by(default_set: true, destination: 'billing_address.street2')
  dic_address_line_2 = data_import.data_import_columns.where(name: 'address_line_2').first_or_create(column_index: (col_index += 1), data_dictionary_set_id: dds_address_line_2.id)
  
  dds_city = DataDictionarySet.find_by(default_set: true, destination: 'billing_address.city')
  dic_city = data_import.data_import_columns.where(name: 'city').first_or_create(column_index: (col_index += 1), data_dictionary_set_id: dds_city.id)
  
  dds_state_code = DataDictionarySet.find_by(default_set: true, destination: 'billing_address.state_code')
  dic_state_code = data_import.data_import_columns.where(name: 'state_code').first_or_create(column_index: (col_index += 1), data_dictionary_set_id: dds_state_code.id)
  
  dds_postal_code = DataDictionarySet.find_by(default_set: true, destination: 'billing_address.zip')
  dic_postal_code = data_import.data_import_columns.where(name: 'postal_code').first_or_create(column_index: (col_index += 1), data_dictionary_set_id: dds_postal_code.id)
  
  dds_country_iso3 = DataDictionarySet.find_by(default_set: true, destination: 'billing_address.country_iso3')
  dic_country_iso3 = data_import.data_import_columns.where(name: 'country_iso3').first_or_create(column_index: (col_index += 1), data_dictionary_set_id: dds_country_iso3.id)
  
  dds_longitude = DataDictionarySet.find_by(default_set: true, destination: 'billing_address.lng')
  dic_longitude = data_import.data_import_columns.where(name: 'longitude').first_or_create(column_index: (col_index += 1), data_dictionary_set_id: dds_longitude.id )
  
  dds_latitude = DataDictionarySet.find_by(default_set: true, destination: 'billing_address.lat')
  dic_latitude = data_import.data_import_columns.where(name: 'latitude').first_or_create(column_index: (col_index += 1), data_dictionary_set_id: dds_latitude.id )
  
  # Now go through our cells
  new_cells = []
  cells_to_process = data_import_cells.where.not(content: nil)
  cells_to_process = cells_to_process.where(id: data_import_cell_ids) if data_import_cell_ids.present?
  
  resultset_size = cells_to_process.size
  counter = 0
  cells_to_process.find_each do |cell|
    counter += 1
    puts "[#{counter}/#{resultset_size}] Processing cell #{cell.id} #{cell.content}"
    
    if addr = Address::NormalizedAddress.from_string(cell.content)
      new_cells << { content: addr.address_line1, data_import_row_id: cell.data_import_row_id, data_import_column_id: dic_address_line_1.id } if addr.address_line1.present?
      new_cells << { content: addr.address_line2, data_import_row_id: cell.data_import_row_id, data_import_column_id: dic_address_line_2.id } if addr.address_line2.present?
      new_cells << { content: addr.city, data_import_row_id: cell.data_import_row_id, data_import_column_id: dic_city.id } if addr.city.present?
      new_cells << { content: addr.state_code, data_import_row_id: cell.data_import_row_id, data_import_column_id: dic_state_code.id } if addr.state_code.present?
      new_cells << { content: addr.postal_code, data_import_row_id: cell.data_import_row_id, data_import_column_id: dic_postal_code.id } if addr.postal_code.present?
      
      # Go ISO3
      country_iso3 = country_iso_to_iso3_map[addr.country_iso]
      new_cells << { content: country_iso3, data_import_row_id: cell.data_import_row_id, data_import_column_id: dic_country_iso3.id } if country_iso3.present?
      
      new_cells << { content: addr.longitude, data_import_row_id: cell.data_import_row_id, data_import_column_id: dic_longitude.id } if addr.longitude.present?
      new_cells << { content: addr.latitude, data_import_row_id: cell.data_import_row_id, data_import_column_id: dic_latitude.id } if addr.latitude.present?
    end
  end
  DataImportCell.import(new_cells, on_duplicate_key_update: { conflict_target: [:data_import_row_id,:data_import_column_id], columns: [:content] })
end