[英]Advanced search on multiple associations in 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
等等...
現在我想添加更多高級條件,比如找到只有PHP
和Java
等技能的用戶(所以只返回那些兼具兩種技能的用戶)
這只有在我插入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個搜索參數中,只需要一個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.