ActiveRecord Эквивалентный SQL для данного оператора - PullRequest
0 голосов
/ 03 июля 2018

Ассоциация

Budget

has_many :approvers

Approver

belongs_to :budget

Требование

  • проверить, есть ли в бюджетах неназначенные утверждающие лица.

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

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

У меня следующий код 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 голосов
/ 03 июля 2018
all_budgets_with_no_approvers = Budget.joins('left outer join approvers on budget.id = approvers.budget_id').where(approvers: { budget_id: nil })

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...