Description

Hyper Active Record is to showcase the features that would make active record super awesome

Install

gem install hyper_active_record

If you are using bundler - add dependency in gem file

gem 'hyper_active_record'

What do you get

Hyper Active Record adds the ability to query active record models by virtual attributes. This is achieved by enhancing the active record query methods where, all, count to allow scope names in conditions. It works just like passing column names in conditions. The scope on a model acts as a virtual column.

For example : If Project model is defined as

  class Project < ActiveRecord::Base
    #Columns - :name, :start_date, :end_date, :priority
    scope :started_after, lambda { |date| where('start_date > ?', date) }
    scope :completed, lambda { where('end_date IS NOT NULL') }
  end

You can do

  Project.where(:completed => true, :started_after => 2.years.ago, :priority => 1)

This works on any active record relation

  Company.projects.where(:completed => true, :started_after => 2.years.ago)

Also you can use scoped_by method on a active record relation. This method accepts a hash of scope name and parameters and returns a scoped object.

  Project.scoped_by(:completed => true, :started_after => 2.years.ago)

How is this useful?

You can use this to search a model by the query parameters(may be from a search form) in the index action of a controller. The query parameters can be a combination of database columns and virtual columns (provided a scope is defined for the virtual column).

If you are already using inherited_resources and has_scope, unit testing the controller would become simpler if implementation has_scope is changed to just pass all the query params to where or all method on the model. This would eliminate the need of data setup for testing the has_scope declaration on a controller. With this change you can just mock the model's query method to verify the scope name was passed as a condition in the method parameters.

What next?

The intention of this gem is to just get a feel of the benefits from this feature.

I would like to see these features built into the active_record instead of a monkey patch like this.