Связывание двух столбцов в одном классе модели с одним и тем же столбцом в другой модели - Rails - PullRequest
0 голосов
/ 31 мая 2018

Быстрый вопрос - у меня есть два модельных класса - Транзакции и Счета .

Модель Account выглядит следующим образом:

 create_table "accounts", force: :cascade do |t|
    t.string   "account_name"
    t.integer  "account_number"
    t.boolean  "current_asset"
    t.boolean  "non_current_asset"
    t.boolean  "current_liability"
    t.boolean  "non_current_liability"
    t.boolean  "equity"
    t.boolean  "cost_of_sales"
    t.boolean  "operating_expense"
    t.boolean  "sales"
    t.boolean  "other_income"
    t.boolean  "bank"
    t.datetime "created_at",            null: false
    t.datetime "updated_at",            null: false
    t.integer  "user_id"
  end

Модель Transaction выглядит следующим образом:

 create_table "transactions", force: :cascade do |t|
    t.date     "date"
    t.string   "description"
    t.string   "reference"
    t.integer  "amount"
    t.integer  "account_id"
    t.boolean  "payment"
    t.boolean  "receipt"
    t.integer  "bank_id"
    t.datetime "created_at",          null: false
    t.datetime "updated_at",          null: false
    t.integer  "user_id"
    t.boolean  "vat"
    t.integer  "vat_amount"
    t.integer  "transaction_form_id"
    t.integer  "contact_id"
  end

Пользователь добавляет новую транзакцию, в которой с помощью collection_select он выбирает учетную запись, в которой отображаются все учетные записи, за исключением случаев, когда bank == true (где bank == true представляет банковский счет).

Когда пользователь выбирает банк, он может выбрать только банковский счет - где bank==true (снова через выбор коллекции).

Мне нужно запустить метод, который позволяет мне вызывать все суммы транзакции через модель Account, основываясь на bank_id, а не account_id.Итак, как мне связать два разных столбца моей модели транзакции с одним и тем же столбцом в классе Accounts через account_id или bank_id.

Метод будет выглядеть примерно так:

<% Account.each do |account| %>
<% if account.bank == true && account.transaction(:bank_id) == account.id %>
<%= account.number %>
<%= account.number %>
<%= account.transactions.sum(:amount) %>
<% end %>

Ps: я знаю, что это по моему мнению, а не контроллер, но это для другого обсуждения!

Образец модели

1 Ответ

0 голосов
/ 31 мая 2018

Я предлагаю вам вернуться и переосмыслить свой подход.

Банковский счет и счет 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 %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...