2012-10-04 57 views
2

我想一個交易(無關SQL交易),這對於這些用例「負責」的模式:如何建模在Rails的半金融交易

  • 用戶可以存錢在他的預付費賬戶
  • 用戶還可以從同一個賬戶
  • 用戶可以匯款(幫個忙)撤回到另一個用戶

一個建議是使用中的交易模型以下屬性:森der_id,receiver_id和favor_id。在這種情況下,前兩個用例將具有與用戶(sender_id和receiver_id)和favor_id設置爲nil的字段之一,這會違背belongs_to的目的(交易屬於接收者,發件人和好評者)。下面是這個版本的片段:

class Transaction < ActiveRecord::Base 

    attr_accessible :sender, :receiver, :favor, :amount 

    belongs_to :sender, :class_name => "User" 
    belongs_to :receiver, :class_name => "User" 
    belongs_to :favor, :foreign_key => "favor_id" 

    scope :of_user, lambda { |user_id| 
    where("sender_id = ? or receiver_id = ?", user_id, user_id) 
    } 

    scope :external_of_user, lambda { |user_id| 
    where("(sender_id = ? AND receiver_id IS NULL) or (receiver_id = ? AND sender_id IS NULL)", user_id, user_id) 
    } 

end 

第二個建議是在每一交易使用user_ID的,但在這種情況下,兩個用戶之間所有的交易將創造兩項紀錄,一是屬於發件人和具有負號,而第二個屬於接收者並具有正數。在這種情況下,存在的fav_id將表明它是存款/取款還是支付幫忙。

這兩個聽起來更合理些?

+0

正是我需要知道的! –

+0

你的青睞總會有與他們相關的獎勵嗎? – iouri

+0

是的,每個人的支付都是支付的 –

回答

1

也許是這樣的:

class User < ActiveRecord::Base 
    has_many :transactions 
end 

class Transaction < ActiveRecord::Base 
    belongs_to :user 
    has_one :favor 
    has_one :recipient, :through => :favor 
end 

class Favor < ActiveRecord::Base 
    belongs_to :transaction 
    belongs_to :recipient, :class_name => 'User' 
end 
+0

歡呼聲,使用這個有一些小修改(基於來自Matzi的評論),但它的工作原理。 –

1

我在財務應用程序的一些經驗。在該系統中,我們對交易雙方使用了「兩條腿」。一條腿有一個負數,另一條腿取決於方向,還有一個金融交易把兩者結合在一起。通過這種方式,您可以輕鬆地在賬戶中彙總腿部,而無需打擾其他方面。看起來有點多餘(它是),但它更像是舊書的習俗,並且您可以更容易地總結,因爲您不需要根據用戶在發送方或接收方時確定方向的交易。當金錢出現在系統中時,您可以通過單支交易輕鬆建模存款和提款。

順便說一句,你不應該在這個用戶。因爲用戶可以共享帳戶(例如公司),所以用戶可以擁有多個帳戶。當然用戶並不是很有趣,重要的是錢。

相關問題