Rails:范围

时间:2015-11-29 02:48:29

标签: ruby-on-rails join

我在我的Rails应用程序(Rails 4)中使用了大量的范围搜索,并且遇到了我必须使用连接子句的问题。

我有一个有很多员工的班级公司。每个员工都有一个WorkId(1到5)。

编辑(2015-11-29):公司与员工之间的关系是“company_employee_relations” - 由company_idemployee_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”范围内,以便它不会在其他范围或视图等中中断。

我该怎么办?

2 个答案:

答案 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))