Rails中多个关联的高级搜索



我试图为我的候选模型构建高级搜索查找器。让我们想象它有几个字段+多个关联,比如has_many: languages &has_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.name &language.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个搜索参数只需要一个搜索逻辑调用@ 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

最新更新