Запрос по параметрам - PullRequest
       1

Запрос по параметрам

3 голосов
/ 21 октября 2019

Я хочу получить записи на основе полученных параметров. Иногда я получаю 2 параметра, а иногда 3. Я написал код для получения результатов, когда все 3 параметра получены, но когда я получаю только 1 параметр, получаю 0 результатов.

Пример

Office.where(state: params[:state], type: params[:type]).where("name like ?","%#{params[:name]}%")

Когда я получаю такие значения, как

{state: "KA", type: "private", name: "google"}

Но когда я получаю только {name: "google"}, я не получаю никаких записей

Я пробовал с условием

If params[:name].present? && params[:state].present? && params[:type].present?
query
elsif condition
query
end

Дайте мне знать, как я могу решить это или как-то лучше

Ответы [ 2 ]

4 голосов
/ 21 октября 2019

Вы можете сделать что-то вроде этого

В контроллере

filter_params = params.slice(:state, :type, :name)
Office.filter(filter_params)

В Office модель

scope :state, -> (state) { where(state: state) }
scope :type, -> (type) { where(type: type) }
scope :name, -> (name) { where("name LIKE ?", "%#{name}%") }

def self.filter(filter_params)
  results = where(nil)
  filter_params.each do |key, value|
    results = results.public_send(key, value) if value.present?
  end
  results
end

PS: выполняется один запроснезависимо от количества параметров!

Надеюсь, это поможет!

3 голосов
/ 21 октября 2019

Если параметр отсутствует, он, вероятно, будет пустым. Если вы передадите их все, это приведет к таким пунктам, как 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?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...