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