0
下面是我在搜索頁面過濾項目辦:按相關訂購相關的軌道
@experiences = Mission.where(active: true)
@experiences = @experiences.where(accept_families: true) if filter_params['forFamily'].present? && filter_params['forFamily'] == true
@experiences = @experiences.includes(:country_missions).where(:country_missions => { :country_id => filter_params['countries'] }) if filter_params['countries'].present?
@experiences = @experiences.includes(:skill_all).where(:skill_missions => { :skill_id => filter_params['skills'] }) if filter_params['skills'].present?
months = []
months.push(12, 1, 2) if filter_params['start_winter'].present? && filter_params['start_winter'] == true
@experiences = @experiences.joins(:start_dates).includes(:start_dates).where('extract(month from start_dates.start) IN (?)', months) unless months.blank?
我想不過濾這些項目,而是,排序,某種度量的得分;與選定的標籤,字符串等更巧合 - 分數越高,任務顯示得越高。
我想成爲這樣的查詢:
SELECT title, company, user, CASE
WHEN upper(company_name) LIKE '%#{word[0].upcase}%' THEN 3
WHEN upper(company_name) LIKE '%#{company_name.upcase}%' THEN 2
ELSE 0 END as score
FROM selected_tables
WHERE company_name LIKE '%#{company_name}%'
ORDER BY score DESC;
但是,這有點太簡單了;我無法想象如何爲每個標籤獲取「while」情況:例如,每個filter_params ['countries']都包含一個ID數組:[212,30,1]。 對於每個國家而言,這就像存在於模型項目中一樣,得分會加1.
我該如何做?
我正在使用Postgres for database。
我已經嘗試過類似
SELECT *,
CASE
WHEN true THEN 0
END as score,
CASE
WHEN "skill_missions"."skill_id" IN (1) THEN score = score + 1
END,
CASE
WHEN "skill_missions"."skill_id" IN (2) THEN score = score + 1
END
FROM missions
LEFT OUTER JOIN "skill_missions" ON "skill_missions"."mission_id" = "missions"."id"
但是,這是不正確的。