class Collection2csv::Convertor

Public Class Methods

new(params) click to toggle source
# File lib/collection2csv/convertor.rb, line 4
def initialize(params)
  @klass =  params[:klass].constantize
  @column_names_from_params = params[:column_names].presence
  @associations_from_params = params[:associations].presence
  @column_names =  @column_names_from_params || @klass.column_names
  @associations =  @associations_from_params || {}
  @association_class_names = {}
  @association_column_names = []
  @primary_ids = params[:ids]
end

Public Instance Methods

perform() click to toggle source
# File lib/collection2csv/convertor.rb, line 15
def perform
  validate
  download
end

Private Instance Methods

association_column_names() click to toggle source
# File lib/collection2csv/convertor.rb, line 77
def association_column_names
  @associations.each do | association_key, association_value |
    association_value.each { |column_name| @association_column_names << "#{association_key}_#{column_name}" }
  end
  @association_column_names.map(&:camelize)
end
construct_error_msg(false_entities,pluralizer) click to toggle source
# File lib/collection2csv/convertor.rb, line 43
def construct_error_msg(false_entities,pluralizer)
  false_entities.join(', ') + ' ' + pluralizer.pluralize(false_entities.count) + ' not found'
end
download() click to toggle source
# File lib/collection2csv/convertor.rb, line 27
def download
  @collections = @klass.includes(@associations.try(:keys)).find(@primary_ids)
  to_csv(@collections,@column_names,@associations)
end
generate_column_data(collection) click to toggle source
# File lib/collection2csv/convertor.rb, line 84
def generate_column_data(collection)
  data = collection.attributes.values_at(*@column_names)
  data = @associations.empty? ?  data : generate_column_data_for_association(collection, data)
end
generate_column_data_for_association(collection, data) click to toggle source
# File lib/collection2csv/convertor.rb, line 89
def generate_column_data_for_association(collection, data)
  @associations.each do  |association_key , association_value |
    obj = collection.public_send(association_key)
    data += obj.present? ? obj.attributes.values_at(*association_value) : Array.new(association_value.count,"")
  end
  data
end
generate_header() click to toggle source
# File lib/collection2csv/convertor.rb, line 72
def generate_header
  @header = @column_names.map(&:camelize)
  @header += association_column_names
end
get_association_class_names() click to toggle source
# File lib/collection2csv/convertor.rb, line 59
def get_association_class_names
  @klass.reflect_on_all_associations.each  do |association|
    @association_class_names["#{association.name}"] = association.options[:class_name].presence || association.name.to_s.camelize
  end
end
raise_error(false_entities, pluralizer, source = nil) click to toggle source
# File lib/collection2csv/convertor.rb, line 37
def raise_error(false_entities, pluralizer, source = nil)
  msg = construct_error_msg(false_entities, pluralizer)
  msg << ' in ' if source.present?
  raise msg + source
end
to_csv(collections,column_names,associations) click to toggle source
# File lib/collection2csv/convertor.rb, line 97
def to_csv(collections,column_names,associations)
  CSV.generate do |csv|
    csv << generate_header
    @collections.each { |collection| csv << generate_column_data(collection) }
  end
end
validate() click to toggle source
# File lib/collection2csv/convertor.rb, line 22
def validate
  validate_columns if @column_names_from_params.present?
  validate_associations if @associations_from_params.present?
end
validate_association_column_names() click to toggle source
# File lib/collection2csv/convertor.rb, line 65
def validate_association_column_names
  @associations.each do |association_key , association_value|
    false_columns = association_value - @association_class_names[association_key.to_s].constantize.column_names
    raise_error(false_columns,'column',association_key) unless false_columns.empty?
  end
end
validate_association_keys() click to toggle source
# File lib/collection2csv/convertor.rb, line 54
def validate_association_keys
  non_associative_keys = @associations.keys - @klass.reflections.keys
  raise_error(non_associative_keys,'association') unless non_associative_keys.empty?
end
validate_associations() click to toggle source
# File lib/collection2csv/convertor.rb, line 47
def validate_associations
  unless @associations.empty?
    get_association_class_names
    validate_association_column_names
  end
end
validate_columns() click to toggle source
# File lib/collection2csv/convertor.rb, line 32
def validate_columns
  false_columns = @column_names - @klass.column_names
  raise_error(false_columns,'column',@klass.name) unless false_columns.empty?
end