2015-11-29 79 views
1

我在我的Rails應用程序(Rails 4)中使用了大量的範圍搜索,並且在我必須使用連接子句時陷入了這個問題。Rails:加入範圍中的模糊表

我有一個班的公司有很多員工。每個員工都有一個WorkId(1到5)。

編輯(2015年11月29日):公司與員工之間的關係的habtm通過「company_employee_relations」 - 表包括company_idemployee_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」範圍內,以便它不會在其他示波器或視圖等中破壞。

我該怎麼辦?

回答

1

我認爲,如果你願意有這種系統中的手工編碼的SQL片段,然後你的範圍很可能會成爲:

scope :has_several_active_employees, -> { where("(select count(employees.work_id = 1) from company_employee_relations r join employees e on r.employee_id = e.id where r.company_id = companies.id) > 4") 

......或者......

scope :has_several_active_employees, -> { where(:id => CompanyEmployeeRelation.joins(:employee).references(:employee).where(:employees => {:work_id => 1}).group(:company_id).having("count(*) > 4").pluck(:company_id)) 
+0

謝謝,這似乎是正確的路要走。我忘了提及員工和公司通過「company_employee_relation」表格來表達關係的關鍵信息。這使得這個解決方案無法工作。我已經將該信息添加到了現在的問題中。對於那個很抱歉。 – Christoffer

+0

這是我以前的解決方案(沒有考慮work_id):scope:has_many_employees, - > {where(%q {(SELECT COUNT(*)FROM company_employee_relations r WHERE r。company_id = companies.id)> 9})} – Christoffer

+0

@Christoffer我認爲只要在這些查詢中包含中間表就可以正常工作。 –

1

更改is_active範圍..

scope :is_active, -> { where('companies.active = 1') } 

這將避免出現歧義時,合併範圍。

+0

謝謝,我對這個問題的描述不夠清楚,這對我不起作用。我的意思是,它解決了症狀,但只是暫時的,因爲問題繼續存在,並導致公司模型的其他範圍和用途出現模棱兩可的問題。我現在在我的問題中添加了這些信息。 – Christoffer