class ActiveAdmin::AsyncExporter::Worker

Public Instance Methods

perform(options = {}) click to toggle source
# File lib/active_admin/async_exporter/reports/worker.rb, line 6
def perform(options = {})
  controller = options[:controller].classify.constantize.new
  columns = options[:columns]
  file_name = filename(options[:file_name], controller)

  path = Rails.root.join('tmp', file_name)

  CSV.open(path, 'wb', headers: true) do |csv|
    build_csv(csv, columns, controller, options)
  end

  file = Services::StorageService.call(path: path, name: file_name).store
  AdminReport.find(options[:admin_report_id]).update_attributes!(
    status: :ready,
    location_url: file.url
  )
end

Private Instance Methods

build_csv(csv, columns, controller, options) click to toggle source
# File lib/active_admin/async_exporter/reports/worker.rb, line 44
def build_csv(csv, columns, controller, options)
  headers = columns.keys
  evaluators = columns.values

  csv << headers.map(&:to_s)

  collection(controller, options).find_in_batches do |group|
    group.each do |model|
      model = model.decorate if options[:decorate_model]

      csv << csv_field_value(model, evaluators)
    end
  end
end
code_from_string(code_string) click to toggle source
# File lib/active_admin/async_exporter/reports/worker.rb, line 31
def code_from_string(code_string)
  code_string.scan(%r{/(do|{)\s+(\|.*\|)(.*)(end|})/m}).flatten.join('')
end
collection(controller, options) click to toggle source
# File lib/active_admin/async_exporter/reports/worker.rb, line 35
def collection(controller, options)
  controller.current_collection.ransack(options[:query]).result
end
csv_field_value(model, evaluators) click to toggle source
# File lib/active_admin/async_exporter/reports/worker.rb, line 59
def csv_field_value(model, evaluators)
  evaluators.collect do |ev|
    value = ev[:value]

    if ev[:block]
      code_proc = proc_from_string(value)
      code_proc.yield(model)
    else
      model.send(value)
    end
  end
end
filename(file_name, controller) click to toggle source
# File lib/active_admin/async_exporter/reports/worker.rb, line 39
def filename(file_name, controller)
  file_name ||= controller.current_collection.name.pluralize.downcase
  [file_name, Time.current.to_i].join('_') + '.csv'
end
proc_from_string(code_string) click to toggle source
# File lib/active_admin/async_exporter/reports/worker.rb, line 26
def proc_from_string(code_string)
  proc_string = code_from_string(code_string)
  Proc.class_eval("proc #{proc_string}")
end