ActiveRecord::Filter

ActiveRecord::Filter provides and easy way to accept user input and filter a query by the input.

Installtion

  • Add gem 'activerecord-filter', require: 'active_record/filter'
  • Run bundle install

Examples

Normal columns:

“by Property.filter(id: 5).to_sql Property.filter(id: 5).to_sql Property.filter(id: 5).to_sql

=> “… WHERE properties.id = 5 …”

Property.filter(id: 5).to_sql Property.filter(id: 5).to_sql Property.filter(id: 5).to_sql

=> “… WHERE properties.id != 5 …”

Property.filter(id: [5, 10, 15]).to_sql

=> “… WHERE properties.id IN (5, 10, 15) …”

Property.filter(id: [5, 10, 15]).to_sql

=> “… WHERE properties.id IN (5, 10, 15) …”

Property.filter(id: [5, 10, 15]).to_sql

=> “… WHERE properties.id NOT IN (5, 10, 15) …”

Property.filter(id: 5).to_sql Property.filter(id: 5).to_sql

=> “… WHERE properties.id > 5 …”

Property.filter(id: 5).to_sql Property.filter(id: 5).to_sql Property.filter(id: 5).to_sql

=> “… WHERE properties.id >= 5 …”

Property.filter(id: 5).to_sql Property.filter(id: 5).to_sql

=> “… WHERE properties.id < 5 …”

Property.filter(id: 5).to_sql Property.filter(id: 5).to_sql Property.filter(id: 5).to_sql

=> “… WHERE properties.id <= 5 …”

Property.filter(address_id: nil).to_sql

=> “… WHERE properties.address_id IS NULL …”

Property.filter(address_id: false).to_sql

=> “… WHERE properties.address_id IS NULL …”

Property.filter(boolean_column: false).to_sql

=> “… WHERE properties.boolean_column = FALSE …”

Property.filter(address_id: true).to_sql

=> “… WHERE properties.address_id IS NOT NULL …”

Property.filter(boolean_column: true).to_sql

=> “… WHERE properties.boolean_column = TRUE …”

String columns:

“by Property.filter(name: ‘nam%’).to_sql

=> “… WHERE properties.name LIKE ‘nam%’ …”

Property.filter(name: ‘nam%’).to_sql

=> “… WHERE properties.name ILIKE ‘nam%’ …”

Property.filter(name: ‘name’).to_sql

=> “… WHERE to_tsvector(”properties“.”name“) @@ to_tsquery(‘name’) …”

It can also work with array columns:

“by Property.filter(tags: ‘Skyscraper’).to_sql

=> “…WHERE properties.tags = ‘’Skyscraper’‘…”

Property.filter(tags: [Skyscraper, Brick]).to_sql

=> “…WHERE properties.tags = ‘”Brick“’…”

Property.filter(tags: [Skyscraper, Brick]).to_sql

=> “…WHERE properties.tags && ‘”Brick“’…”

Property.filter(tags: [Skyscraper, Brick]).to_sql

=> “…WHERE accounts.tags @> ‘”Brick“’…”

Property.filter(tags: [Skyscraper, Brick]).to_sql

=> “…WHERE NOT (accounts.tags @> ‘”Brick“’)…”

Property.filter(tags: [Skyscraper, Brick]).to_sql

=> “…WHERE accounts.tags <@ ‘”Brick“’…”

And JSON columns:

“by Property.filter(metadata: { eq: { key: ‘value’ } }).to_sql

=> “…WHERE ”properties“.”metadata“ = ‘"key":"value"’…”

Property.filter(metadata: { contains: { key: ‘value’ } }).to_sql

=> “…WHERE ”properties“.”metadata“ @> ‘"key":"value"’…”

Property.filter(metadata: { has_key: ‘key’ }).to_sql

=> “…WHERE ”properties“.”metadata“ ? ‘key’…”

Property.filter(metadata: { has_keys: [key1, key2] }).to_sql

=> “…WHERE ”properties“.”metadata“ ?& array[key1, key2]…”

Property.filter(metadata: { has_any_key: [key1, key2] }).to_sql

=> “…WHERE ”properties“.”metadata“ ?| array[key1, key2]…”

Property.filter(“metadata.key”: { eq: ‘value’ }).to_sql

=> “…WHERE ”properties“.”metadata“ #> ‘key’ = ‘value’…”

It can also sort on relations:

“by Photo.filter(property: ‘Empire State’).to_sql

=> “… LEFT OUTER JOIN properties ON properties.id = photos.property_id …

=> “… WHERE properties.name = ‘Empire State’”