ActiveRecord Эквивалентный SQL для данного оператора

0

ассоциация

Budget

has_many :approvers

Approver

belongs_to :budget

требование

  • проверьте, нет ли каких-либо бюджетов неназначенных утвердителей.

В других мирах (скажем, есть 3 бюджета)

  • если все 3 бюджета имеют approvers_count> 0, он должен возвращать false.
  • Если какой-либо из этих бюджетов имеет approvers_count <= 0, тогда он должен вернуть true.

У меня есть код ruby, который вызывает проблему с производительностью, я хочу изменить это на эквивалентный SQL или ActiveRecord Statement:

Проблемный код

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?

Любое предложение приветствуется.

ПРИМЕЧАНИЕ. Я пытаюсь проверить, есть ли какой-либо из бюджетов (в тысячах бюджета), если есть бюджет, который не присвоен ему.

Теги:
activerecord

1 ответ

1
Лучший ответ
all_budgets_with_no_approvers = Budget.joins('left outer join approvers on budget.id = approvers.budget_id').where(approvers: { budget_id: nil })

Это приведет к возврату всех бюджетов без выделения ассигнований.

  • 0
    Спасибо Ришид, попробую это решение.
  • 0
    Это работает правильно?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню