Nothing better than a use case to explain the purpose of this gem.
- Suppose you have to build a dashboard in the admin area of your Rails app and you want to have the number of subscriptions per day.
- Suppose that you are using SQLite3 for development, MySQL for production (pretty standard setup)
Easily with SQL date functions, you could do that :
Subscriber.select('STRFTIME("%Y-%m-%d", created_at) AS day, COUNT(*) AS subscriptions').group('day')
Which would run this query :
SELECT STRFTIME("%Y-%m-%d", created_at) AS day, COUNT(*) AS subscriptions FROM subscribers GROUP BY day
… but wait… now the app has to go live in my production env which uses MySQL ! Replace STRFTIME()
with DATE_FORMAT()
.
What if tomorrow I switch to PostgreSQL ? Replace DATE_FORMAT()
with DATE_TRUNC()
.
The SqlFunk gem translates SQL functions that do the exact same thing, but have different syntax in each RDBMS that is being used.
So far, these functions are implemented :
count_by(column_name, :group_by => "day"|"week"|"month"|"year")
- … more to come
In your Gemfile:
gem ‘sql_funk’
Given that you have a Subscriber model.
Subscriber.count_by("created_at", :group_by => "day")
Will generate these queries depending on the database adapter that is being used :
# SQLite SELECT STRFTIME("%Y-%m-%d", created_at) AS day, COUNT(*) AS subscriptions FROM subscribers GROUP BY day # MySQL SELECT DATE_FORMAT(created_at, "%Y-%m") AS day, COUNT(*) AS subscriptions FROM subscribers GROUP BY day # PostgreSQL SELECT DATE_TRUNC("day", created_at) AS day, COUNT(*) AS subscriptions FROM subscribers GROUP BY day