Skip to content

Instantly share code, notes, and snippets.

@schacon
Created February 3, 2009 23:02
Show Gist options
  • Select an option

  • Save schacon/57815 to your computer and use it in GitHub Desktop.

Select an option

Save schacon/57815 to your computer and use it in GitHub Desktop.
require 'munger'
class DemographicReport
include Munger
def initialize(program_ids, start_date, end_date)
date_range = "assessments.created_at #{(start_date..end_date).to_s(:db)}"
participant_result = Participant.find(:all,
:conditions => "program_id in (#{program_ids}) AND #{date_range}",
:joins => :assessments )
@participant_data = Munger::Data.load_data(participant_result)
demographic_result = Demographic.find(:all,
:conditions => "program_id in (#{program_ids}) AND #{date_range}",
:joins => :assessment )
@demographic_data = Munger::Data.load_data(demographic_result)
@age_data = build_age_data(program_ids, date_range)
end
def build_age_data(program_ids, date_range)
age_data = Munger::Data.new
AgeRange::AGE_RANGES.each do |name, range|
result = Demographic.find(:all,
:select => "count(age_when_taken) as count",
:conditions => "age_when_taken between #{range.first} and
#{range.last} and program_id in (#{program_ids}) AND #{date_range}",
:joins => :assessment )
data = Munger::Data.load_data(result)
data.add_column(:age, :default => name)
age_data << data.data
end
age_data
end
def gender_report
data = munge_data(:gender, @participant_data)
data = translate_column(data, :gender, Gender::GENDER['en-US'])
report = munge_report(data, :gender)
puts Munger::Render.to_text(report)
end
def race_report
data = munge_data(:race, @participant_data)
data = translate_column(data, :race, Race::RACES['en-US'])
report = munge_report(data, :race)
puts Munger::Render.to_text(report)
end
def age_report
report = Munger::Report.from_data(@age_data)
report.process
puts Munger::Render.to_text(report)
end
private
def munge_data(field, data)
rows = data.size
data.group(field, :count => :id)
data.add_column('percent') do |r|
(r.count_id.to_f / rows.to_f) * 100
end
data
end
def translate_column(data, column_name, translation_hash)
data.transform_column(column_name) do |r|
eval("translation_hash[r.#{column_name}]")
end
end
def munge_report(data, column_name)
report = Munger::Report.from_data(data)
report.columns(:count_id => 'count')
report.columns([column_name, :count_id, :percent])
report.aggregate(:sum => [:count_id, :percent])
report.process
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment