Scope для модели с двойным внешним ключем

У меня есть модели Category и Transaction.

Category has_many transactions, Transaction belongs_to category.

Так же Transaction имеет два столбца debit_amount и credit_amount.

У меня есть скоуп который сортирует категории по сумме transaction.debit_amount + transaction.credit_amount:

Category.joins(:transactions)
      .where('transactions.created_at >= ?', 1.month.ago)
      .select(
        'categories.*',
        'SUM(transactions.credit_amount_cents + transactions.debit_amount_cents) AS total_amount'
      )
      .order('total_amount DESC')
      .group('categories.id')

И этот скоуп работает.

Так же у меня есть модель Account, которая так же Account has_many transactions. Но для нее я использую двойной внешний ключ:

account.rb:

  has_many :debit_account_transactions,
    class_name: 'Transaction',
    foreign_key: 'debit_account_id',
    dependent: :nullify
  has_many :credit_account_transactions,
    class_name: 'Transaction',
    foreign_key: 'credit_account_id',
    dependent: :nullify

transaction.rb:

  belongs_to :credit_account, class_name: 'Account',
    foreign_key: 'credit_account_id', optional: true
  belongs_to :debit_account, class_name: 'Account',
    foreign_key: 'debit_account_id', optional: true

Я хочу использовать скоуп и для этой модели. Я его немного переделал:

Account.joins(:credit_account_transactions, :debit_account_transactions)
      .where('transactions.created_at >= ?', 1.month.ago)
      .select(
        'accounts.*',
        'SUM(transactions.credit_amount_cents + debit_account_transactions_accounts.debit_amount_cents) AS total_amount'
)
      .order('total_amount DESC')
      .group('accounts.id')

Но он работает не правильно, в него не попадают аккаунты, у которых transaction.debit_amount == 0

Тогда я его еще малость переделал, заменив joins на left_joins, и в него стали попадать аккаунты у которых transaction.debit_amount == 0. НО, теперь, у этих аккаунтов (где transaction.debit_amount == 0) почему то total_amount считается как 0.

В чем может быть проблема? Возможно скоуп стоит более существенно переделать? Если да - то как?


Ответы (0 шт):