给定语句的ActiveRecord等效SQL

时间:2018-07-03 09:32:05

标签: mysql sql ruby-on-rails postgresql activerecord

协会

Budget

has_many :approvers

Approver

belongs_to :budget

要求

  • 检查是否有未分配批准者的预算。

在其他世界(假设有3个预算)

  • 如果所有3个预算的approvers_count> 0都应返回false。
  • 如果该预算中有任何一个的批准人数<= 0,则应返回true。

我有以下Ruby代码,这会导致性能问题,我想将其更改为等效的SQL或ActiveRecord语句:

问题代码

budgets.archived(false).includes(:approvers).select do |b| b.approvers.empty? end.any?

我的解决方案未提供正确的结果

budgets
  .archived(false)
  .where("not exists (select 1 from approvers where approvers.budget_id = budgets.id)")
  .any?

任何建议都值得赞赏。

  

注意:我正在尝试检查是否有预算(数千个预算中)是否有未分配批准者的预算。

1 个答案:

答案 0 :(得分:1)

all_budgets_with_no_approvers = Budget.joins('left outer join approvers on budget.id = approvers.budget_id').where(approvers: { budget_id: nil })

这将返回所有未分配批准者的预算。