class RailsAdminImport::Formats::CSVImporter

Public Class Methods

new(import_model, params) click to toggle source
Calls superclass method
# File lib/rails_admin_import/formats/csv_importer.rb, line 12
def initialize(import_model, params)
  super
  @encoding = params[:encoding]
  @header_converter = RailsAdminImport.config.header_converter
end

Public Instance Methods

each_record() { |attr| ... } click to toggle source

A method that yields a hash of attributes for each record to import

# File lib/rails_admin_import/formats/csv_importer.rb, line 19
def each_record
  CSV.foreach(filename, **csv_options) do |row|
    attr = convert_to_attributes(row)
    yield attr unless attr.all? { |field, value| value.blank? }
  end
end

Private Instance Methods

convert_to_attributes(row) click to toggle source
# File lib/rails_admin_import/formats/csv_importer.rb, line 65
def convert_to_attributes(row)
  row.each_with_object({}) do |(field, value), record|
    next if field.blank?
    field = field.to_sym
    if import_model.has_multiple_values?(field)
      field = import_model.pluralize_field(field)
      (record[field] ||= []) << value
    else
      record[field] = value
    end
  end
end
csv_options() click to toggle source
# File lib/rails_admin_import/formats/csv_importer.rb, line 28
def csv_options
  defaults = RailsAdminImport.config.csv_options
  options = {
    headers: true,
    header_converters: @header_converter,
    encoding: encoding,
  }

  defaults.merge(options)
end
detect_encoding() click to toggle source
# File lib/rails_admin_import/formats/csv_importer.rb, line 56
def detect_encoding
  charset = CharlockHolmes::EncodingDetector.detect File.read(filename)
  if charset[:confidence] > 0.6
    from_encoding = charset[:encoding]
    from_encoding = "UTF-8" if from_encoding == "ascii"
  end
  from_encoding
end
encoding() click to toggle source
# File lib/rails_admin_import/formats/csv_importer.rb, line 39
def encoding
  from_encoding =
    if !@encoding.blank?
      @encoding
    else
      detect_encoding
    end

  to_encoding = import_model.abstract_model.encoding

  if from_encoding && from_encoding != to_encoding
    "#{from_encoding}:#{to_encoding}"
  else
    nil
  end
end