Я предлагаю вам вернуться и переосмыслить свой подход.
Банковский счет и счет GL - это очень разные вещи (хотя они оба используют слово «счет»).Использование единой модели для представления обоих из них приведет к путанице и множеству пустых полей.Подумайте об использовании BankAccount
и GLAccount
(вы можете использовать пользовательские inflection
на GLAccount
, если хотите, так что вы можете сделать gl_account
).
Если вы используете BankAccount
иGLAccount
, тогда вы можете просто сделать полиморфную ассоциацию с вашей моделью Transaction
, например:
class Transaction < ActiveRecord::Base
belongs_to :account, polymorphic: true
end
Вам нужно изменить таблицу transactions
, чтобы она включала account_type
и account_id
чтобы это работало.
Тогда ваши модели BankAccount
и GLAccount
будут выглядеть примерно так:
class BankAccount < ActiveRecord::Base
has_many :transactions, as: :account
end
и
class GLAccount < ActiveRecord::Base
has_many :transactions, as: :account
end
В этом случаедля итерации BankAccounts вы должны сделать что-то вроде:
<% BankAccount.all.each do |bank_account| %>
<%= bank_account.number %>
<%= bank_account.transactions.sum(:amount) %>
<% end %>
Это в конечном итоге приведет к проблеме запроса N + 1, но вы можете разобраться с этим отдельно.
Кстати, наваши учетные записи GL, вы должны использовать enums
для типа учетной записи.Так как вы сейчас настроили его, у вас будет всегда иметь 8 пустых логических полей (не очень хорошо).Это может выглядеть примерно так:
class GLAccount < ActiveRecord::Base
has_many :transactions, as: :account
enum account_type: {
current_asset: 0,
non_current_asset: 1,
current_liability: 2,
non_current_liability: 3,
equity: 4,
cost_of_sales: 5,
operating_expense: 6,
sales: 7,
other_income: 8
}
end
Ваша таблица gl_accounts
должна включать account_type
в качестве целого числа, чтобы это работало.
Пара других случайных заметок:
if account.bank == true
должно быть просто if account.bank
- Вы повторяете
<%= account.number %>
Однако, учитывая то, что вы сделали, вы могли бы сделать что-то вроде:
class Account < ActiveRecord::Base
has_many bank_transactions, class_name: 'Transaction', foreign_key: :bank_id
end
В этом случае вы должны иметь возможность:
<% Account.where(bank: true).each do |bank_account| %>
<%= bank_account.number %>
<%= bank_account.bank_transactions.sum(:amount) %>
<% end %>