Skip to content

Instantly share code, notes, and snippets.

@SViccari
Created September 25, 2019 18:28
Show Gist options
  • Save SViccari/23c332b6eb7561a6c6b2e81e2c2b7b58 to your computer and use it in GitHub Desktop.
Save SViccari/23c332b6eb7561a6c6b2e81e2c2b7b58 to your computer and use it in GitHub Desktop.
Generate CSV data
class CsvGenerator
def initialize(file_name, collection)
@file_name = file_name
@collection = collection
@columns = []
end
def register_column(column_header, &block)
columns << Column.new(column_header, block)
end
def to_csv
CSV.open(file_name, 'w') do |csv|
csv << build_header
collection.each { |record| csv << build_row(record) }
end
end
private
attr_reader :file_name, :collection
attr_accessor :columns
def build_header
columns.map(&:header)
end
def build_row(record)
columns.map { |column| record.instance_exec(&column.block) }
end
class Column < Struct.new(:header, :block); end
end
require 'csv'
class InviteCodesReport
def to_csv(file_name)
CsvGenerator.new("#{file_name}.csv", invite_codes).tap do |generator|
generator.register_column("Invite Code") { code }
generator.register_column("Invite Code Created At") { created_at }
generator.register_column("Care Provider Name") { care_provider.name }
generator.register_column("Care Provider ID") { care_provider.id }
end.to_csv
end
private
def invite_codes
InviteCode.where(id: invite_code_ids).includes(care_provider: :address)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment