2011-02-18 75 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而不是你稱之爲噁心解決方案的方案來建模你的解決方案。