module LpCSVExportable::CanExportAsCSV

Attributes

collection[RW]
column_class[RW]

Public Class Methods

included(base) click to toggle source
# File lib/lp_csv_exportable/can_export_as_csv.rb, line 5
def self.included(base)
  base.extend ClassMethods
end

Public Instance Methods

to_csv() click to toggle source
# File lib/lp_csv_exportable/can_export_as_csv.rb, line 9
def to_csv
  CSV.generate do |csv|
    csv << headers
    data_matrix.each do |row|
      csv << row
    end
  end
end

Private Instance Methods

call_model_method(model_method, memo) click to toggle source
# File lib/lp_csv_exportable/can_export_as_csv.rb, line 54
def call_model_method(model_method, memo)
  if respond_to?(model_method)
    send(model_method, memo)
  else
    memo.try(model_method)
  end
end
columns() click to toggle source
# File lib/lp_csv_exportable/can_export_as_csv.rb, line 24
def columns
  self.class.columns_hashes.map do |hash|
    column_class.new(hash)
  end
end
data_matrix() click to toggle source
# File lib/lp_csv_exportable/can_export_as_csv.rb, line 34
def data_matrix
  # array of arrays
  # i.e. rows 2+ of CSV
  collection.map do |obj|
    columns.map do |column|
      column.format(retrieve_value(obj, column))
    end
  end
end
headers() click to toggle source
# File lib/lp_csv_exportable/can_export_as_csv.rb, line 30
def headers
  columns.map { |c| c.header.try(:to_s) }
end
retrieve_value(obj, column) click to toggle source
# File lib/lp_csv_exportable/can_export_as_csv.rb, line 44
def retrieve_value(obj, column)
  # only one method to retrieve value
  return call_model_method(column.model_method, obj) if column.model_method.present?
  # chain methods to retrieve value (jsonb store)
  # i.e. employee.market_data.min
  column.model_methods.inject(obj) do |memo, model_method|
    call_model_method(model_method, memo)
  end
end