我在我的Rails應用程序(Rails 4)中使用了大量的範圍搜索,並且在我必須使用連接子句時陷入了這個問題。Rails:加入範圍中的模糊表
我有一個班的公司有很多員工。每個員工都有一個WorkId(1到5)。
編輯(2015年11月29日):公司與員工之間的關係的habtm通過「company_employee_relations
」 - 表包括company_id
和employee_id
我需要一個範圍內進行搜索,我搜索:
公司與具有至少5個僱員一WorkID = 1
我已設法用做這在一定程度上:
scope :has_several_active_employees, -> { where(:id => (Company.joins(:employees).group("companies.id").having("count(employees.work_id = 1) > 4")).collect(&:id)) }
這帶來了正確的解決方案,但會導致一些曖昧的作風問題的路線時,我打算用示波器匹配它:
scope :is_active, -> { where(:active => true) }
這樣
Company.is_active.has_several_active_employees
此外,這不似乎是一個非常優雅的解決方案,它非常緩慢。
我需要的是「插入連接子句,然後再出來」,所以我可以鏈接這些範圍,而不會結束含糊不清的問題。
編輯:我應該提及,改變「is_active
」不是一個可行的選擇,因爲我有這樣的幾個用途。基本上,問題需要在來源處解決,即在「has_several_active_employees
」範圍內,以便它不會在其他示波器或視圖等中破壞。
我該怎麼辦?
謝謝,這似乎是正確的路要走。我忘了提及員工和公司通過「company_employee_relation」表格來表達關係的關鍵信息。這使得這個解決方案無法工作。我已經將該信息添加到了現在的問題中。對於那個很抱歉。 – Christoffer
這是我以前的解決方案(沒有考慮work_id):scope:has_many_employees, - > {where(%q {(SELECT COUNT(*)FROM company_employee_relations r WHERE r。company_id = companies.id)> 9})} – Christoffer
@Christoffer我認爲只要在這些查詢中包含中間表就可以正常工作。 –