2011-12-22 3 views
1

Im пытается построить расширенный поиск искателя для моей модели кандидата. Предполагает, что у него есть пары полей + несколько ассоциаций, таких как has_many: languages & has_many: skills. Теперь я создаю запрос, как это:Расширенный поиск по нескольким ассоциациям в Rails

query = Candidate.select("*") 
if position_name 
    query = query.where('position_name LIKE ? OR position_name IS NULL',"%#{position_name}%") 
end 

if salary 
    query = query.where('salary <= ? OR salary IS NULL',salary) 
end 

и так далее ...

Теперь я хочу, чтобы добавить более продвинутые условия, как найти пользователей, которые имеют только такие навыки, как PHP и Java (так возврат только те пользователи, которые имеют как навыки)

Это работает, но только тогда, когда я вставляю OR

query = query.joins(:skills) 
    query = query.where('`skills`.`name` = ? OR `skills`.`name` = ?',"Java","PHP") 

Дополнительно Я бы хотел, чтобы он тоже был для языков (плюс, язык language.name & language.level)

Может кто-то указывает мне, в каком направлении смотреть? А также как построить такое условие, когда я могу использовать несколько навыков или несколько языков?

+0

Вы можете серьезно рассмотреть вопрос об использовании поисковой системы, как [Мышление сфинкса] (http://freelancing-god.github.com/ts/en/), так как он делает такие задачи, как это один тривиальный, а также делает поиск пылает быстро. – iwasrobbed

+0

Я попробую это. Благодарю. – Johny

ответ

3

Посмотрите на различных поисковых драгоценных камней, как рыскать, Metawhere или Searchlogic

http://rubygems.org/gems/ransack

https://github.com/railsdog/searchlogic

Оба Ransack и Searchlogic позволяют поиск на связанных моделей, и вы можете использовать областей для ограничения поиска параметры.

Пример Поиск параметров для Searchlogic.

[search][admitted_gte] 

[search][admitted_lte] 

[search][aetiology_like_any][] VIRUS 

[search][at_risk_gte] 

[search][at_risk_lte] 

[search][died_gte] 

[search][died_lte] 

[search][gezi_reference_like] 

[search][id]  

[search][incidents_location_encrypted_postcode_like]  

[search][lab_confirmed_gte] 

[search][lab_confirmed_lte] 

[search][onset_first_after] 

[search][onset_first_before]  

[search][onset_last_after] 

[search][onset_last_before] 

[search][outbreak_type_equals_any][] FOODBORNE 

[search][point_source_date_after] 

[search][point_source_date_before] 

[search][total_affected_gte]  

[search][total_affected_lte]  

[search][user_reference_like] 

[search][year_equals_any][] 2010 

search[order] descend_by_id 

Outbreak_Controller.rb Индексное действие возвращает результаты поискового запроса. Из 17 параметров поиска требуется только один поисковый запрос @search = Outbreak.search(params[:search]). Параметрам присваивается список разрешенных параметров поиска - код не показан.

def index 

      #set the default index order to be descending Outbreak id 
      if !params[:search][:order] 
       params[:search][:order] = "descend_by_id" 
      end 
      if params[:search][:bacterial_agents_bacterium_name_like_any] != nil && !params[:search][:bacterial_agents_bacterium_name_like_any].empty? 
       params[:search][:bacterial_agents_category_like] = "CAUSATIVE" 
      end 
      if params[:search][:viral_agents_virus_name_like_any] != nil && !params[:search][:viral_agents_virus_name_like_any].empty? 
       params[:search][:viral_agents_category_like] = "CAUSATIVE" 
      end 
      if params[:search][:protozoal_agents_protozoa_name_like_any] != nil && !params[:search][:protozoal_agents_protozoa_name_like_any].empty? 
       params[:search][:protozoal_agents_category_like] = "CAUSATIVE" 
      end 
      if params[:search][:toxic_agents_toxin_name_like_any] != nil && !params[:search][:toxic_agents_toxin_name_like_any].empty? 
       params[:search][:toxic_agents_category_like] = "CAUSATIVE" 
      end 
    #Outbreak.search takes all of the given params and runs it against the Outbreak model and it's associated models 
    @search = Outbreak.search(params[:search]) 
end