Metricky
Display metrics about your database in your application. Depends on the awesome Chartkick and Groupdate.
Demo (with code!)
Usage
Make this in Ruby:
Generate it
rails g metricky:metric TotalUsersMetric --scope User --type :count --period :day
Display it
In your view where you want to display the metric:
render_metric :total_users
Customize it
In app/metrics/total_users_metric.rb
class TotalUsersMetric < ApplicationMetric
def scope
User
end
def type
:count
end
def period
:day
end
end
Installation
Add this line to your application's Gemfile:
gem 'metricky'
And then execute:
$ bundle
Or install it yourself as:
$ gem install metricky
Then drop in Chartkick into your application.js
(or similar):
//= require chartkick
Customizing
Blatantly ripped from Super-inspired by Laravel Nova's metric system.
Sending more data into the metric
Need to pass current_user
?
render_metric :users, user: current_user, account: current_account
user
and account
will be attr_reader
-ized.
Value to calculate
In your metric, define columns:
def columns
:id
end
Grouping the value
To User.all.group(:color).count
def group
:color
end
Grouping by period (day, month, year, quarter, etc.)
In your metric, define what period:
def period
:day
end
This can be any one of Groupdate::PERIODS
Define what column should be used:
def period_column
:created_at
end
Value type
In your metric, define what type:
def type
:count
end
This can be any one of :min, :max, :sum, :count, :average
Ranges
Ranges are what values are available on the form (used to query the metric, if applicable) via the range_column
def range_column
:created_at
end
Defaults are all
, today
, 24 hours
, 3 days
, 7 days
, 10 days
, 14 days
, 30 days
, 3 months
, 6 months
, 12 months
Creating a new range
In your metric, define what ranges as a class method:
class TotalUsersMetric < ApplicationMetric
register_range '15h', label: "15 hours" do
15.hours.ago
end
end
Removing a range
class TotalUsersMetric < ApplicationMetric
remove_ranges '24h', '7d' # an array
remove_range '3d' # individual
end
Removing all ranges
class TotalUsersMetric < ApplicationMetric
reset_ranges!
end
Setting the default range
class TotalUsersMetric < ApplicationMetric
default_range '24h'
end
Customizing the label
Use collection_label
class TotalUsersMetric < ApplicationMetric
def collection_label(range_thing)
"Born #{range_thing.value.call}"
end
end
Need helpers? h
class TotalUsersMetric < ApplicationMetric
def collection_label(range_thing)
"Born #{h.time_ago_in_words(range_thing.value.call)}"
end
end
Partial
In your metric, define the partial path:
def to_partial_path
"shared/metric"
end
Take a look at app/views/metricky/_metric.html.erb
for implementation.
Contributing
Add stuff.
License
The gem is available as open source under the terms of the MIT License.