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'
endYou 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'
endConfigure your class:
class Record < ActiveRecord::Base
include RequiredQueryAttributes
require_query_attribute :date
# Add additional attributes if desired
# require_query_attribute :text
endProfit.
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.