Skip to content

Rails gem that extends ActiveRecord with SQL functions, including date functions

Notifications You must be signed in to change notification settings

FernandoEscher/sql_funk

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Use case

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().

SqlFunk to the rescue

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

Installation

In your Gemfile:


gem ‘sql_funk’

Example

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

About

Rails gem that extends ActiveRecord with SQL functions, including date functions

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Ruby 100.0%