class RailsImporter::Base

Attributes

messages[R]

Public Class Methods

key() click to toggle source

A unique key identifier for importer

# File lib/rails_importer/base.rb, line 30
def self.key
  self.to_s.gsub('Importer', '').demodulize.underscore
end
new(filepath, options={}) click to toggle source
# File lib/rails_importer/base.rb, line 7
def initialize filepath, options={}
  if File.exists?(filepath)
    @filepath = filepath
  end

  @spreadsheet = nil

  @messages = []

  @rows = 0

  begin
    open_spreadsheet

    @rows = @spreadsheet.last_row
  rescue => e
    add_error message: e.message, backtrace: e.backtrace, row_index: nil, data: {}
  end

  # Custom behavior
end
sample_file() click to toggle source

The importer sample file

# File lib/rails_importer/base.rb, line 60
def self.sample_file
  Rails.root.join("lib/rails_importer/templates/#{key}.xlsx")
end

Public Instance Methods

load_data(row:) click to toggle source

Load a file and the get data from each file row

@params

row   => A row to be processed
# File lib/rails_importer/base.rb, line 55
def load_data(row:)
  raise "#{__FILE__}:#{__LINE__} You must define it"
end
process() click to toggle source

Load a file and the get data from each file row

# File lib/rails_importer/base.rb, line 35
def process
  # Load each row element
  2.upto(@rows).each do |row_index|
    ActiveRecord::Base.transaction do
      begin
        load_data row: @spreadsheet.row(row_index)

      rescue => e
        add_error message: e.message, backtrace: e.backtrace, row_index: row_index, data: @spreadsheet.row(row_index)

        raise ActiveRecord::Rollback
      end
    end
  end
end

Private Instance Methods

add_error(message:, backtrace:, row_index:, data:) click to toggle source

Add errors to import

@params

message   => Error message
backtrace => Error Bactrace
row_index => Failed row index
data      => Readed data
# File lib/rails_importer/base.rb, line 82
def add_error(message:, backtrace:, row_index:, data:)
  @messages << {message: message, backtrace: backtrace, row_index: row_index, data: data}
end
open_spreadsheet(sheet_name = '') click to toggle source

Returns a Roo::Spreadsheet instance according the file extension.

# File lib/rails_importer/base.rb, line 67
def open_spreadsheet sheet_name = ''
  extension = File.extname(@filepath.split("/").last)
  @spreadsheet = Roo::Spreadsheet.open(@filepath, extension: extension)
  @spreadsheet.default_sheet = @spreadsheet.sheets.include?(sheet_name) ? sheet_name : @spreadsheet.sheets.first
rescue => e
  add_error message: e.message, backtrace: e.backtrace, row_index: nil, data: {}
end