Если параметр отсутствует, он, вероятно, будет пустым. Если вы передадите их все, это приведет к таким пунктам, как type = ''
. Например, если передано только name
, вы получите что-то вроде ...
where name like '%google%' and type = '' and state = ''
Вам нужно удалить пустые поля. Есть разные способы сделать это. Поскольку у вас есть особый случай, предложение name
, один хороший способ справиться с этим - построить кусочек запроса по частям.
query = Office.all
query = query.where(state: params[:state]) if params[:state].present?
query = query.where(type: params[:type]) if params[:type].present?
query = query.where("name like ?","%#{params[:name]}%") if params[:name].present?
Запрос не будет выполнен, пока вы не получите значения из query
.
Если есть много простых параметров, вы можете создать хеш и удалить пары с пустым значением.
qparams = {
state: params[:state],
type: params[:type]
}.select { |k,v|
v.present?
}
query = Office.where(qparams)
query = query.where("name like ?","%#{params[:name]}%") if params[:name].present?
Или использовать удобный compact_blank gem .
using CompactBlank
qparams = {
state: params[:state],
type: params[:type]
}.compact_blank
query = Office.where(qparams)
query = query.where("name like ?","%#{params[:name]}%") if params[:name].present?