2015-10-06 44 views
0

我需要找到一種方法來顯示我的空缺模型中的所有空缺,但用戶已申請的空缺模型除外。 我在一個獨立的模型AppliedVacancies中保留某個用戶申請的空缺的ID。有兩種不同型號的活動記錄規格

我在想的東西線的線路:

@applied = AppliedVacancies.where(employee_id: current_employee) 
@appliedvacancies_id = [] 
@applied.each do |appliedvacancy| 
    @appliedvacancies_id << appliedvacancy.id 
end 
@notyetappliedvacancies = Vacancy.where("id != ?", @appliedvacancy_id) 

但它似乎不喜歡把自己的ID的數組。我將如何去解決這個問題?

我獲得以下錯誤:

PG :: DatatypeMismatch:錯誤:在哪裏必須是boolean類型的參數,而不是類型的記錄 LINE 1:!選擇 「空缺」 * FROM 「職位空缺」,(ID = 13,14) ^ :SELECT「vacancies」* FROM「vacancies」WHERE(id!= 13,14)

回答

2

這純粹是一個SQL問題。您可以使用!=將值與一組值相比較。您需要使用IN運算符。

@notyetappliedvacancies = Vacancy.where("id NOT IN (?)", @appliedvacancy_id) 

另外,您可以大幅改進迄今爲止編寫的代碼。當您需要的是ID時,您無需爲在您的applied_vacancies表中找到的每個記錄實例化完整的ActiveRecord模型。

在改善第一遍是使用pluck跳過整個過程,直接進入ID列表:

ids = AppliedVacancies.where(employee_id: current_employee).pluck(:id) 
@notyetappliedvacancies = Vacancy.where("id NOT IN (?)", ids) 

接下來,你可以走了一步,並消除第一次查詢都在一起

ids = AppliedVacancies.select(:id).where(employee_id: current_employee) 
@notyetappliedvacancies = Vacancy.where("id NOT IN (?)",App) 

這將生成一個單一的查詢:通過留下它作爲一個AREL投影可直接底塗到第二查詢(或更確切地說,與上次查詢作爲一個子查詢結合它)

select * from vacancies where id not in (select id from applied_vacancies where employee_id = <value>) 
+0

非常感謝你,我有很多東西需要學習,讓我的代碼效率,作爲一個初學者,我大多樂意與「它作品「,但我知道這是我應該真正關注的。再次謝謝你。 –

2

回答類似@meagar,但軌道4,5路:

@notyetappliedvacancies = Vacancy.where.not(id: @appliedvacancy_id) 
+0

謝謝你,我用了兩種答案的組合! –