ActiveRecord: одноранговые модели - PullRequest
0 голосов
/ 18 февраля 2011

Как лучше всего соотносить модели с пэрами?

Например, рассмотрим классический банковский пример

class Transaction < AR::Base
   belongs_to :account
   # attribute: amount decimal
end
class Account < AR::Base
   has_many :transactions
   # attribute name string
end
# move money like this:
t1 = Transaction.create(:amount=>10, :account=>Account.find_by_name('Mine'))
t2 = Transaction.create(:amount=>-10, :account=>Account.find_by_name('Yours'))

Я хочу связать две транзакции, чтобы перейти от определенного депозита к точному выводу, который является противоположным.

Я мог бы добавить это к Transaction модели:

belongs_to :mirror_transaction, :class_name=>'Transaction'
has_one :other_transaction, :class_name=>'Transaction', :foreign_key=>'mirror_transaction_id'

... но это немного странно. Я не могу выразить это лучше, чем это!

Единственный другой способ, который я могу придумать, - это создать третью модель оболочки, что-то вроде:

class TransactionSet < AR::Base
   has_many :transactions
end

Обратите внимание, что я не могу просто расширить свою модель транзакции, чтобы она относилась к обеим учетным записям в одной. Некоторые платежи идут «вне системы», то есть они не будут сопряжены. Кроме того, в реальной проблеме, с которой я столкнулся, модель намного сложнее, и я не хочу удваивать все.

Любой совет или другие идеи?

ТИА!

1 Ответ

0 голосов
/ 18 февраля 2011

Ваучеры имеют дебетовые и кредитные записи. Ваучеры также должны подтвердить, что сумма дебетов и кредитов равна. Модель ваучера инкапсулирует чистую транзакцию. Фактически ваши 2 транзакции должны быть построены через (внутренне) через саму модель ваучера (TransactionSet).

Я делюсь этим с вами, так как сам работаю над созданием системы бухгалтерии / учета.

Вы можете передавать флаги, чтобы предотвратить проверки правильности балансировки, чтобы она не сработала в случае, если определенная пара транзакций выпадает из системы.

В реальном мире такое соединение может быть между несколькими записями транзакции. Например, один дебет с двумя кредитами.

Я знаю, что ваш вопрос носит более технический характер и приносит извинения, если я полагаю слишком много, но вам действительно нужно смоделировать свое решение на основе того, что вы определили как TransactionSet, а не на том, что вы называете своим непристойным решением.

...