Sha256: 9606d470cdaa23aa6f17c69cccf7656280349c8d2beaf804fc8e2f34c3f4e119
Contents?: true
Size: 1.79 KB
Versions: 3
Compression:
Stored size: 1.79 KB
Contents
# Adapted from http://paulbarry.com/articles/2008/04/19/importing-data-with-rails require 'faster_csv' if Object.const_defined?('FasterCSV') module ScaffoldLogic class DataImport attr_reader :file, :fields, :row_map # Class Methods ================================================================================== def self.run(file) new(file).run end def self.save(upload) # create file path _path = File.join('tmp', upload['datafile'].original_filename) # write file File.open(_path, 'wb') { |f| f.write(upload['datafile'].read) } self.run(_path) end # Instance Methods =============================================================================== def initialize(file) @file = file raise 'You must specify a file' unless @file end def initialize_row! unless @fields_initialized initialize_fields! else initialize_row_map! process_row end end def create_from_row( model ) model.create(row_map) end def run @errors = [] @row_index = 1 FasterCSV.foreach(file, :col_sep => "\t", :row_sep => :auto) do |arg| @row = arg initialize_row! @row_index += 1 end @errors end def valid_row? @missing_fields = [] @required_fields.each do |field| @missing_fields << field if row_map[field].blank? end @missing_fields.empty? end private def initialize_fields! @fields = @row.map{ |f| f && f.strip.gsub(' ', '_').underscore.to_sym } @fields_initialized = true end def initialize_row_map! @row_map ||= {} @row_map.clear @row.each_with_index do |_c, _i| @row_map[fields[_i]] = _c && _c.strip end end end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
scaffold_logic-1.7.7 | lib/scaffold_logic/data_import.rb |
scaffold_logic-1.7.6 | lib/scaffold_logic/data_import.rb |
scaffold_logic-1.7.5 | lib/scaffold_logic/data_import.rb |