Настройка запроса к базе данных rails так, чтобы параметры пустой строки игнорировались - PullRequest
0 голосов
/ 03 февраля 2012

Я создаю приложение rails, чтобы пользователи могли искать в базе данных midi-записей и находить midi-файлы, которые соответствуют атрибутам, которые я им дал.Например, пользователь может ввести данные в html-форму для миди-файла с name = "blah" composer = "buh" и затруднением = "insane".Это все хорошо, за исключением того, что я хотел бы, чтобы, когда пользователь не вводил данные для поля, это поле игнорировалось при выполнении оператора select в базе данных.Прямо сейчас это выглядит так:

@midis=Midi.where(:name => params[:midi][:name],
                  :style => params[:midi][:style],
                  :numparts => params[:midi][:numparts],
                  :composer=> params[:midi][:composer],
                  :difficulty => params[:midi[:difficulty])

Это работает, как и ожидалось, но если, например, он / она оставляет :composer пустым, поле composer вообще не должно учитываться.Вероятно, это простая синтаксическая вещь, но я не смог найти на ней никаких страниц.

Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 03 февраля 2012

Не уверен, поддерживает ли Arel это напрямую, но вы всегда можете сделать что-то вроде:

conditions = {
  :name => params[:midi][:name],
  :style => params[:midi][:style],
  :numparts => params[:midi][:numparts], 
  :composer=> params[:midi][:composer],
  :difficulty => params[:midi[:difficulty]
}

@midis=Midi.where(conditions.select{|k,v| v.present?})
1 голос
/ 03 февраля 2012

Попробуйте это:

# Select the key/value pairs which are actually set and then convert the array back to Hash
c = Hash[{
    :name       => params[:midi][:name],
    :style      => params[:midi][:style],
    :numparts   => params[:midi][:numparts],
    :composer   => params[:midi][:composer],
    :difficulty => params[:midi][:difficulty]
  }.select{|k, v| v.present?}]

Midi.where(c)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...