Module: Mongokit::CsvTransformer::ClassMethods

Defined in:
lib/mongokit/csv_transformer.rb

Overview

Example

class Address
  include Mongoid::Document

  mongokit :csv_transformer

  field :name
  field :region
  field :district
  field :state
  field :zip_code, type: Integer

  csv_import_mapping :address, [:name, :zip_code], headers: true do |row, attrs|
    attrs[:zip_code] = attrs[:zip_code].to_i
  end

  csv_export_mapping :address, [:zip_code, :name, :region] do |row, record|
    row[:zip_code] = "IN-#{row[:zip_code]}"
  end
end

Address.from_address_csv('address.csv') # Import
Address.to_address_csv('address.csv')   # Export

Constant Summary collapse

CsvTransformerError =
Class.new(StandardError)

Instance Method Summary collapse

Instance Method Details

#_csv_columns_(options = nil) ⇒ Object



62
63
64
65
66
67
68
69
70
71
# File 'lib/mongokit/csv_transformer.rb', line 62

def _csv_columns_(options = nil)
  columns = fields.collect do |f, o|
    if o.class == Mongoid::Fields::Standard && o.type != BSON::ObjectId
      o.name
    end
  end

  columns.compact!
  options ? Options.process(options[:columns] || columns, options) : columns
end

#csv_export(file, criteria, options = {}, &block) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/mongokit/csv_transformer.rb', line 73

def csv_export(file, criteria, options = {}, &block)
  columns = _csv_columns_(options)
  io = CsvIO.new(:write, file, columns, options)

  criteria.in_batches do |records|
    records.each do |record|
      row = io.to_row(record, block)
      io << row if row
    end
  end

  io.close
end

#csv_export_mapping(name, fields, options = {}, &block) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/mongokit/csv_transformer.rb', line 48

def csv_export_mapping(name, fields, options = {},  &block)
  if respond_to?("to_#{name}_csv")
    raise CsvTransformerError, "#{name} export mapper is already defined."
  end

  self.class.instance_eval do
    define_method "to_#{name}_csv" do |file, criteria = nil|
      options[:columns] = fields
      criteria = self.all if criteria.nil?
      csv_export(file, criteria, options, &block)
    end
  end
end

#csv_import(file, options = {}, &block) ⇒ Object



87
88
89
90
91
92
93
94
# File 'lib/mongokit/csv_transformer.rb', line 87

def csv_import(file, options = {}, &block)
  io = CsvIO.new(:read, file, options[:columns] || _csv_columns_, options)

  io.each do |row|
    attrs = io.to_attrs(row, block)
    create(attrs) if attrs
  end
end

#csv_import_mapping(name, fields, options = {}, &block) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/mongokit/csv_transformer.rb', line 35

def csv_import_mapping(name, fields, options = {},  &block)
  if respond_to?("from_#{name}_csv")
    raise CsvTransformerError, "#{name} import mapper is already defined."
  end

  self.class.instance_eval do
    define_method "from_#{name}_csv" do |file|
      options[:columns] = fields
      csv_import(file, options, &block)
    end
  end
end