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’”
“