Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Rails中多个关联的高级搜索_Sql_Ruby On Rails_Activerecord_Associations - Fatal编程技术网

Sql Rails中多个关联的高级搜索

Sql Rails中多个关联的高级搜索,sql,ruby-on-rails,activerecord,associations,Sql,Ruby On Rails,Activerecord,Associations,我正在尝试为我的候选人模型建立高级搜索引擎。 让我们假设它有两个字段+多个关联,比如有多个:语言&有多个:技能。现在我正在构建如下查询: 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('sal

我正在尝试为我的候选人模型建立高级搜索引擎。 让我们假设它有两个字段+多个关联,比如
有多个:语言
&
有多个:技能
。现在我正在构建如下查询:

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
此外,我还希望语言也一样(另外,语言有
language.name
language.level


有人能告诉我往哪个方向看吗?以及如何建立这样的条件,使我能够掌握多种技能或多种语言?

看看各种搜索宝石,如Ransack、Metawhere或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
exploration\u Controller.rb Index操作返回搜索查询的结果。从17个搜索参数中,只需要一个searchlogic调用@
Search=export.Search(参数[: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

你可能很想考虑使用一个搜索引擎,因为它让这样的任务变得微不足道,同时也使得搜索变得非常快。谢谢
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