【问题标题】:Advanced search on multiple associations in RailsRails 中多个关联的高级搜索
【发布时间】:2023-03-10 06:00:01
【问题描述】:

我正在尝试为我的候选模型构建高级搜索器。 让我们想象一下它有几个字段 + 多个关联,例如 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

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

【问题讨论】:

  • 您可能真的想考虑使用像 Thinking Sphinx 这样的搜索引擎,因为它使这样的任务变得微不足道,而且搜索速度也很快。
  • 我会试试这个。谢谢。

标签: sql ruby-on-rails activerecord associations


【解决方案1】:

看看各种搜索宝石,例如 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])。这些参数根据允许的搜索参数列表列入白名单 - 代码未显示。

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

【讨论】:

    猜你喜欢
    • 2017-03-07
    • 2019-09-09
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    相关资源
    最近更新 更多