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