Skip to content

pmamediagroup/reports_as_sparkline

 
 

Repository files navigation

ReportsAsSparkline

ReportsAsSparkline enables you to generate reports and sparklines from your model’s data with very little effort.

Usage

If you hace a User model with created_at and activated_at columns, you can just add reports_as_sparkline to it with the following options:

  • :date_column - The name of the date column on that the records are aggregated

  • :value_column - The name of the column that holds the value to sum for aggregation :sum

  • :aggregation - The aggregation to use (one of :count, :sum, :minimum, :maximum or :average); when using anything other than :count, :value_column must also be specified (If you really want to e.g. sumon the ‘id’ column, you have to explicitely say so.)

  • :grouping - The period records are grouped on (:hour, :day, :week, :month); Beware that reports_as_sparkline treats weeks as starting on monday!

  • :limit - The number of periods to get (see :grouping)

  • :conditions - Conditions like in ActiveRecord::Base#find; only records that match there conditions are reported on

  • :cumulate - Sets whether to cumulate the numbers (instead of [1, 2, 3] returns [1, 3, 6])

  • :live_data - Specified whether data for the current reporting period is read; if :live_data is true, you will experience a performance hit since the request cannot be satisfied from the cache only (defaults to false)

Example:

class User < ActiveRecord::Base
  reports_as_sparkline :registrations
  reports_as_sparkline :activations,  :date_column => :activated_at
  reports_as_sparkline :total_users,  :cumulate    => true
end

This will add the following class methods to your User model:

User.registrations_report
User.activations_report
User.total_users_report

When invoking the report, you can override some of the options you specified for reports_as_sparkline:

  • :grouping - The period records are grouped on (:hour, :day, :week, :month)

  • :limit - The number of periods to get (see :grouping)

  • :conditions - Conditions like in ActiveRecord::Base#find; only records that match there conditions are reported on

  • :live_data - Specified whether data for the current reporting period is read; if :live_data is true, you will experience a performance hit since the request cannot be satisfied from the cache only (defaults to false)

Example:

User.registrations_report(:conditions => ['last_name LIKE 'A%'])
User.activations_report(:grouping => :week, :limit => 5)

Beware that when specifying conditions on invocation of the report, the cache will not be used!

You can than render sparklines for these reports with sparkline_tag in your view:

<%= sparkline_tag(User.registrations_report) %>

The sparkline_tag helper takes the following parameters:

  • width - The width of the generated image

  • height - The height of the generated image

  • line_color - The line color of the sparkline (hex code)

  • fill_color - The color to fill the area below the sparkline with (hex code)

  • labes - The axes to render lables for (Array of :x, :y, :r, :t; this is x axis, y axis, right, top)

Installation

Installation requires 3 simple steps:

get the plugin

From your RAILS_ROOT in Rails &gt;= 2.1, do

./script/plugin install git://github.com/mk/reports_as_sparkline.git

If you are on Rails &lt; 2.1, do this from your RAILS_ROOT

git clone git://github.com/mk/reports_as_sparkline.git vendor/plugins/reports_as_sparkline

generate migration

./script/generate reports_as_sparkline_migration add_reports_as_sparkline_tables

migrate

rake db:migrate

Performance

To achieve best performance, you should add indices to your tables on the date columns that are used for grouping the records (see Kvlr::ReportsAsSparkline::ClassMethods.reports_as_sparkline):

add_index :[table], :[date_column]

If you are on PostgreSQL, you should add functional indices:

add_index :[table], :[date_column], :functional => "date_trunc('hour', [date_column])"
add_index :[table], :[date_column], :functional => "date_trunc('day',  [date_column])"
add_index :[table], :[date_column], :functional => "date_trunc('week', [date_column])"
add_index :[table], :[date_column], :functional => "date_trunc('year', [date_column])"

TODOs/ future plans

  • support for Oracle and DB2 (and others?) missing

  • Implement data ranges in arguments

  • Limit number of data points to maximum that the google chart api allows

  • Make graph styling configurable

If you want ot suggest any new features or report bugs, do so at simplabs.lighthouseapp.com/projects/21060-reportsassparkline/overview.

© 2008-2009 Martin Kavalar, Marco Otte-Witte (simplabs.com/#projects), released under the MIT license

About

rails gem for easy reporting using google chart api sparklines

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Ruby 100.0%