ruby-on-rails - 如何在 Rails 中模拟半金融交易

标签 ruby-on-rails activerecord

我正在尝试建模一个事务(与 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/

相关文章:

ruby-on-rails - SSE 消息是否通过 https 连接加密?

ruby-on-rails - Cache-Control header 通过 send_data 方法恢复为私有(private)

ruby-on-rails - 为 ActiveRecord 关联创建 View 的教程?

sql - Ruby on Rails find_by 不区分大小写

ruby-on-rails - ActiveRecord::Base 不属于从 ActiveRecord 降级的层次结构

ruby-on-rails - Ruby on Rails : Capistrano 3 deployment error

ruby-on-rails - rails 安装错误

ruby-on-rails - Rails has_many 自定义 ActiveRecord 关联

ruby-on-rails - 如何在表单中编辑 Rails 序列化哈希?

ruby-on-rails - Ruby on Rails 中的 Gem 路径错误