【问题标题】:How to model semi-financial transactions in Rails如何在 Rails 中为半金融交易建模
【发布时间】:2012-10-05 04:36:23
【问题描述】:

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

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

一个建议是在 Transaction 模型上使用以下属性:sender_id、receiver_id 和 favour_id。在这种情况下,前两个用例将有一个与用户相关的字段(sender_id 和 receiver_id)和喜爱的id 设置为 nil,这有点违背了 belongs_to 的目的(交易属于接收者、发送者和喜爱)。这是此版本的 sn-p:

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 的存在将表明它是存款/取款还是支付人情。

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

【问题讨论】:

  • 你的恩惠总是有奖励吗?
  • 这里有什么好处?为什么它是一个交易领域?真正的问题。如果我只是想给某人汇款而不是人情,而是欠债怎么办?

标签: ruby-on-rails activerecord


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    可能是这样的:

    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
    

    【讨论】:

    • 干杯,用这个做了一些小的修改(基于 Matzi 的评论),但它按预期工作。
    猜你喜欢
    • 1970-01-01
    • 2010-12-21
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多