簡體   English   中英

高級搜索Rails中的多個關聯

[英]Advanced search on multiple associations in Rails

我正在嘗試為我的候選模型構建高級搜索查找器。 讓我們想象一下它具有幾個字段以及多個關聯,例如has_many: languageshas_many: skills 現在我正在構建這樣的查詢:

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

等等...

現在我想添加更多高級條件,比如找到只有PHPJava等技能的用戶(所以只返回那些兼具兩種技能的用戶)

這只有在我插入OR時才有效

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

另外,我也希望語言也一樣(加上,語言具有language.namelanguage.level

有人能指出我在哪個方向看? 以及如何建立可以同時使用多種技能或多種語言的條件?

看看各種搜索寶石,如Ransack,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個搜索參數中,只需要一個searchlogic調用即可:@ search = Outbreak.search(params[:search]) params被列入允許搜索參數列表的白名單 - 代碼未顯示。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM