2011-02-18 72 views
0

将模型作为对等模型关联的最佳方式是什么?ActiveRecord:对等模型

例如,考虑经典的银行业例子

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 

请注意,我不能简单地延长我的交易模式涉及到两个账户中的一个。一些付款“超出系统”,即他们不会配对。另外,在现实世界的问题中,模型要复杂得多,我不想把所有东西都加倍。

任何建议或其他想法?

TIA!

回答

0

优惠券有借方和贷方条目。凭证还需要验证借方和贷方的总和是否相等。凭证模型封装净交易。事实上,你的2个交易必须通过(内部)通过凭证(TransactionSet)模型本身来构建。

我与你分享这件事,因为我正在自己建立一个簿记/会计系统。

您可能会传递标志以防止平衡验证,以防某些事务配对落入系统之外时无法启动。

在现实世界中,这种配对可以在多个交易条目之间进行。例如,一个借方与2个学分配对。

我知道你的问题更具技术性并且道歉,如果我假设太多了,但你确实需要围绕你已经确定的TransactionSet而不是你称之为恶心解决方案的方案来建模你的解决方案。