2017-02-21 60 views
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" 

但是,這是不正確的。

回答

0

如果我理解正確你尋找的是這樣的:

SELECT title, company, user, 
     CASE WHEN upper(company_name) LIKE '%#{word[0].upcase}%' THEN 3 ELSE 0 END 
    + CASE 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;