module Mongokit::CsvTransformer::ClassMethods

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

Constants

CsvTransformerError

Public Instance Methods

_csv_columns_(options = nil) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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