2

我正在尝试建模一个事务(与 SQL 事务无关),它对这些用例“负责”:

  • 用户可以将钱存入他的预付账户
  • 用户也可以从同一个帐户中提款
  • 一个用户可以向另一个用户汇款(为了一个忙)

一个建议是在 Transaction 模型上使用以下属性:sender_id、receiver_id 和 favour_id。在这种情况下,前两个用例将有一个与用户相关的字段(sender_id 和 receiver_id)和喜爱的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,但在这种情况下,两个用户之间的每个事务都会创建两个记录,第一个属于发送者并具有负数,而第二个属于接收者并具有正数。在这种情况下,喜爱 ID 的存在将表明它是存款/取款还是支付人情。

这两个哪个听起来更合理?

4

2 回答 2

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
于 2012-10-04T20:31:20.917 回答
1

我在金融应用方面有一些经验。在那个系统中,我们使用“两条腿”进行交易的两侧。一条腿有负数,另一条有正数,具体取决于方向,金融交易也将两者结合在一起。通过这种方式,您可以轻松总结帐户的腿,而不必打扰其他方面。似乎有点多余(确实如此),但它更像是旧的簿记习惯,您可以更轻松地总结,因为您不需要根据用户是发送方还是接收方来决定方向的交易。当资金神秘地出现在系统中时,您可以通过单腿交易轻松模拟存款和取款。

顺便说一句,您不应该在此使用用户。使用帐户,因为用户可以共享帐户(例如公司),并且任何用户都可以拥有多个帐户。当然,用户并不是很有趣,重要的是钱。

于 2012-10-04T20:32:25.620 回答