我在我的Rails应用程序(Rails 4)中使用了大量的范围搜索,并且遇到了我必须使用连接子句的问题。
我有一个有很多员工的班级公司。每个员工都有一个WorkId(1到5)。
编辑(2015-11-29):公司与员工之间的关系是“company_employee_relations
” - 由company_id
和employee_id
我需要搜索范围内的搜索范围:
拥有至少5名员工的公司,其工作ID = 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
”范围内,以便它不会在其他范围或视图等中中断。
我该怎么办?
答案 0 :(得分:1)
将您的is_active
范围更改为..
scope :is_active, -> { where('companies.active = 1') }
这样可以避免在合并范围时出现歧义。
答案 1 :(得分: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))