Skip to content
Default process for where with semantic params
Ruby
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
lib
test
.gitignore
Gemfile
LICENSE
README.en.md
README.md
Rakefile
default_where.gemspec

README.md

DefaultWhere

default_where set default params process for where query in ActiveRecord

It's a wise decision to use default_where with default_form to replace ransack

使用说明

语法概览

  • 等于:key: value
  • 范围:key-gte: value,
  • 排序:key-asc: 1, key-desc: 2
  • 排除:key-not: value

对于postgresql 数据库

  • 包含任一值:key-any: value

Normal equal params

  • Params:
# rails 4 and later, default_where does nothing
params = { role_id: 1, age: 20 }
User.default_where(params)

Equal params with association

  • params
User.belongs_to :role
params = { name: 'dhh', 'role.id': 2 }

# you can use any table name or reference name
params = { name: 'dhh', 'roles.id': 2 }
  • Before use default_where
User.includes(:student).where(name: params[:name], role: {id: params[:'role.id']})
  • After Use default_where
User.default_where(params)

Range params

  • params
params = { 'role_id-lte': 2 }
  • Before use default_where
User.where('role_id >= ?', params[:'role_id-lte'])
  • After use default_where
User.default_where(params)

Auto remove blank params by default, no need write query with if else

  • params
params = { age: '', role_id: 1 }
  • Before use default_where
users = User.where(role_id: params[:role_id])
users = users.where(age: params[:age]) if params[:age]
  • After use default_where
User.default_where(params)

allow

you can control which blank value can use

{
  name: nil,
  allow: { name: nil }
}

OR

params = {
  or: { 
    'users.email-not': 'qin',
    'name': 'qin'
  }
}

Auto call strip for string

  • params
params= { name: ' dhh ' }
  • Before use default_where
User.where(name: params[:name].strip)
  • After use default_where
User.default_where(params)

# also can control whether use strip

{
  name: ' qin',
  strip: { 
    name: false
  }
}

Order params

  • Params
params = { 'age-asc': '1', 'last_login_at-asc': '2' }
  • Before use default_where
User.order(age: :asc, last_login_at: :asc)
  • After use default_where
User.default_where(params)

For Postgresql

  • support JSONB filter,just use like this: column_name/json_key, just notice jsonb all value is string type;
# before
Order.where("extra->>'maintain_id' = :key", key: id.to_s) 
# after
Order.default_where('extra/maintain_id': id.to_s)

A sample with all params above

  • Params
{ 
  name: 'dhh',
  'role.id': 2, 
  'age-lte': 2, 
  'age-asc': '1', 
  'last_login_at-asc': '2',
  or: {
    name: 'dhh',
    email: 'dhh'
  },
  allow: { name: nil }
}
  • Before use default_where
User.includes(:role).where(name: params[:name], 'roles.id': params[:'role.id']).order(age: :asc, last_login_at: :asc)
  • After use default_where
User.default_where(params)

注意

You can’t perform that action at this time.