Rails/MongoDb Search и уточнение поиска реализации
У меня есть функция поиска в моем приложении, которая работает следующим образом
- Домашняя страница: пользователь выбирает местоположение из раскрывающегося списка, затем вводит ключевое слово поиска и выполняет поиск, чтобы получить набор результатов
- Страница поиска (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
значения с помощью простой таблицы поиска.