【问题标题】:Rails: Ambiguous tables in join for scopeRails:连接范围内的不明确表
【发布时间】:2015-11-29 02:48:28
【问题描述】:

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

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

编辑(2015-11-29):公司和员工之间的关系是通过一个“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”范围内,这样它就不会在其他范围或视图等中中断。

我能做什么?

【问题讨论】:

    标签: ruby-on-rails join


    【解决方案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))
    

    【讨论】:

    • 谢谢,这似乎是正确的道路。我忘了提到员工和公司通过“company_employee_relation”表建立了 habtm-relationship 的关键信息。这使得这个解决方案不起作用。我现在已将该信息添加到问题中。对此感到抱歉。
    • 这是我以前的解决方案(没有考虑 work_id): scope :has_many_employees, -> { where(%q{(SELECT COUNT(*) FROM company_employee_relations r WHERE r.company_id = Companies .id) > 9 })}
    • @Christoffer 好吧,我认为只要在其中任何一个查询中包含中间表就可以了。
    • 再次感谢。我真的不明白你的意思(尝试了几种方法),你能否更新你的答案以适应这个?
    • 我试了一下——不过可能是错别字。
    【解决方案2】:

    将您的 is_active 范围更改为..

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

    这将在您合并范围时避免歧义。

    【讨论】:

    • 谢谢,我对问题的描述不够清楚,这对我不起作用。我的意思是,它解决了症状,但只是暂时的,因为问题继续存在并导致公司模型的其他范围和用法出现模棱两可的问题。我现在已经在我的问题中添加了这些信息。
    猜你喜欢
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 2011-06-30
    • 1970-01-01
    相关资源
    最近更新 更多