Rails/MongoDb Search и уточнение поиска реализации

У меня есть функция поиска в моем приложении, которая работает следующим образом

  1. Домашняя страница: пользователь выбирает местоположение из раскрывающегося списка, затем вводит ключевое слово поиска и выполняет поиск, чтобы получить набор результатов
  2. Страница поиска (REfine Search Options): как только пользователь перейдет на эту страницу из вышеперечисленного, ему будут предоставлены дополнительные параметры для уточнения поиска и сужения результатов.

Прямо сейчас мы реализуем следующее, но я предполагаю, что при увеличении параметров более 5-7 число комбинаций также увеличит количество операторов if-else-elseif.

#refine search
    @search = params[:search]


    if params[:city].present? && params[:location_ids].present? && params[:search].blank?
      @blood_banks = BloodBank.where(
        { :city_id => "#{@city}" }).where(
        { :location_id.in => params[:location_ids] })
    elsif params[:search].present? && params[:location_ids].blank?
        @blood_banks = BloodBank.where(
          { :bb_name => /#@search/i })
    elsif params[:search].present? && params[:city].present? && params[:location_ids].present?
        @blood_banks = BloodBank.where(
          { :city_id => "#{@city}" }).where(
          { :location_id.in => params[:location_ids] }).where(
          { :bb_name => /#@search/i })
    end 

Какой лучший способ реализовать то же самое.

Как вы добиваетесь ниже кода,

if params[:gender].present?
      if params[:gender] == "male"
      @doctors = Doctor.where( :gender => "Male")
      end
      if params[:gender] == "female"
      @doctors = Doctor.where( :gender => "Female")
      end
      if params[:gender] == "any"
      @doctors = Doctor.where( :gender => "Male") || Doctor.where( :gender => "Female")
      end
end

1 ответ

Mongoid-х where возвращает Mongoid::Criteria а также Mongoid::Criteria отвечает на where вернув другой Mongoid::Criteria, Это означает, что вы можете построить свой запрос по частям:

@blood_banks = BloodBank.all
if params[:city].present?
  @blood_banks = @blood_banks.where(:city_id => params[:city])
end
if params[:location_ids].present?
  @blood_banks = @blood_banks.where(:location_id.in => params[:location_ids])
end
...

Что касается второй части, то если вы ищете какой-либо пол, то просто не указывайте его, тогда вы можете делать такие вещи, как:

@doctors = Doctor.all
genders = { 'male' => 'Male', 'female' => 'Female' }
if genders.has_key? params[:gender]
  @doctors = @doctors.where(:gender => genders[params[:gender]]
end

Поиск любого пола - это то же самое, что и фильтрация по полу. nil а также 'all' случаи одинаковы. Затем вы можете обрабатывать ввод и :gender значения с помощью простой таблицы поиска.

Другие вопросы по тегам