class CSVStepImporter::Model::Model

Attributes

dao_values[RW]

Public Class Methods

cache_key(pluralize: false) click to toggle source

Configuration

# File lib/csv_step_importer/model/model.rb, line 36
def self.cache_key(pluralize: false)
  key = name.underscore.gsub("/", "_")
  (pluralize ? key.pluralize : key.singularize).to_sym
end
new(**attributes) click to toggle source

Logic

Calls superclass method CSVStepImporter::Node::new
# File lib/csv_step_importer/model/model.rb, line 24
def initialize(**attributes)
  super **attributes

  add_daos
  filter_daos! if composite_key_columns
  add_model_children
end

Public Instance Methods

add_daos() click to toggle source
# File lib/csv_step_importer/model/model.rb, line 61
def add_daos
  dao_node_children = rows.collect do |row|
    build_daos_for_row row
  end.flatten.compact

  link_rows_to_daos daos: dao_node_children

  dao_node.add_children dao_node_children
end
add_model_children() click to toggle source

Logic

# File lib/csv_step_importer/model/model.rb, line 45
def add_model_children
  add_children dao_node, prepend: true
end
build_daos_for_row(row) click to toggle source

can return nil, a single object or an array of objects

# File lib/csv_step_importer/model/model.rb, line 72
def build_daos_for_row(row)
  dao_class.new parent: dao_node, row: row
end
dao_node() click to toggle source
# File lib/csv_step_importer/model/model.rb, line 57
def dao_node
  @dao_node ||= CSVStepImporter::Node.new parent: self
end
daos() click to toggle source
# File lib/csv_step_importer/model/model.rb, line 49
def daos
  dao_node.children
end
filter_daos!() click to toggle source

TODO a possible feature would be to add validation errors if the duplicates do not match in all columns (columns other than the composite key)

# File lib/csv_step_importer/model/model.rb, line 77
def filter_daos!
  unique_daos = {}

  daos.keep_if do |dao|
    hash = dao.values_for(composite_key_columns).hash
    keep = (unique_daos[hash] ||= dao) == dao

    # unlink to be deleted dao and add a link to
    dao.unlink! replace_with: unique_daos[hash] unless keep

    keep
  end
end