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.
В чем может быть проблема? Возможно скоуп стоит более существенно переделать? Если да - то как?