RequiredQueryAttributes CircleCI

Enforce presence of specific columns in ActiveRecord queries.

Description

If you have a records table like this:

create_table 'records' do |t|
  t.date     'date'
  t.string   'text'
end

You might want to make sure that SELECT queries always provide a predicate condition on date.

It could be because you have a very large table, and your only good index is on date.

Or maybe your data is partitioned by date, and thus not providing it will trigger full table scan.

RequiredQueryAttributes ensures all SELECT queries provide at least one predicate condition on the desired columns, or they will fail with an exception:

RequiredQueryAttributes::RequiredAttributeMissing:
  Required attributes ["date"] missing from query:
    SELECT "records".* FROM "records" WHERE "records"."text" = 'string_to_find'

Installation

Add this line to your application's Gemfile and execute bundle:

gem 'required_query_attributes'

Usage

Using the same records example:

create_table 'records' do |t|
  t.date     'date'
  t.string   'text'
end

Configure your class:

class Record < ActiveRecord::Base
  include RequiredQueryAttributes

  require_query_attribute :date

  # Add additional attributes if desired
  # require_query_attribute :text
end

Profit.

FYI

This gem tries to do its job as cleanly as possible, only changing ActiveRecord behaviour when necessary.

There are no global changes to ActiveRecord: only models which you choose to install RequiredQueryAttributes are affected.