我正在尝试建模一个事务(与 SQL 事务无关),它对这些用例“负责”:
- 用户可以在其预付费帐户中存钱
- 用户也可以从同一帐户提款
- 用户可以向另一个用户汇款(以求帮忙)
一个建议是在事务模型上使用以下属性:sender_id、receiver_id 和favor_id。在这种情况下,前两个用例将与用户相关的字段之一(sender_id和receiver_id)和favor_id设置为nil,这有点违背了belongs_to的目的(交易属于接收者、发送者和favor)。这是此版本的片段:
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,但在这种情况下,两个用户之间的每个交易都会创建两条记录,第一个属于发送者并具有负数,而第二个属于接收者并具有正数。在这种情况下,favor_id的存在将表明是存款/取款还是支付恩惠。
这两个听起来哪个更合理?
最佳答案
我在金融应用方面有一些经验。在该系统中,我们对交易的两侧使用“两条腿”。根据方向,一条腿的金额为负数,另一条腿的金额为正数,而且一项金融交易将两者联系在一起。通过这种方式,您可以轻松总结帐户的各个部分,而无需费心其他方面。看起来有点多余(确实如此),但它更像是旧的簿记海关,并且您可以更轻松地总结,因为您不需要根据用户是发送方还是接收方来决定方向交易的。当金钱神秘地出现在系统中时,您可以通过单腿交易轻松地模拟存款和取款。
顺便说一句,你不应该在其中使用用户。使用帐户,因为用户可以共享帐户(例如公司),并且任何用户都可以拥有多个帐户。当然,用户并不是真正感兴趣,重要的是钱。
关于ruby-on-rails - 如何在 Rails 中模拟半金融交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12735282/