Ruby on rails 如何在Rails中建模半金融交易
我正在尝试建模一个事务(与SQL事务无关),它“负责”这些用例:Ruby on rails 如何在Rails中建模半金融交易,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我正在尝试建模一个事务(与SQL事务无关),它“负责”这些用例: 用户可以在预付费账户上存款 用户也可以从同一帐户中提款 一个用户可以向另一个用户汇款 一个建议是在事务模型上使用以下属性:发送者\ id、接收者\ id和偏好\ id。在这种情况下,前两个用例将有一个与用户(发送者\ id和接收者\ id)和偏好\ id相关的字段设置为nil,这有点违背了属于\ id的目的(交易属于接收方、发送方和受惠方)。以下是此版本的代码片段: class Transaction < ActiveR
- 用户可以在预付费账户上存款
- 用户也可以从同一帐户中提款
- 一个用户可以向另一个用户汇款
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
类事务“用户”
属于\u to:receiver,:class\u name=>“User”
属于\u to:follow,:foreign\u key=>“follow\u id”
作用域:属于用户,lambda{124; user_id|
其中(“发送方id=?或接收方id=?”,用户id,用户id)
}
作用域:外部用户,lambda{124;用户id|
其中(((发送方\标识=?且接收方\标识为空)或(接收方\标识=?且发送方\标识为空)”,用户\标识,用户\标识)
}
结束
第二个建议是在每笔交易中使用用户id,但在这种情况下,两个用户之间的每笔交易都会创建两条记录,第一条属于发送方,编号为负数,第二条属于接收方,编号为正数。在这种情况下,是否存在人情id将表明它是否是存款/存于DR为帮个忙而道歉或付钱
这两个选项中哪一个听起来更合理?可能是这样的:
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
class用户:人情
结束
类“用户”
结束
我在金融应用方面有一些经验。在那个系统中,我们使用了“两条腿”对于交易双方。根据方向的不同,一条腿的金额为负数,另一条腿的金额为正数。同时,金融交易将两者结合在一起。通过这种方式,您可以轻松总结账户上的腿数,而不必麻烦其他方。似乎有点多余(这是),但这更像是旧的簿记习惯,你可以更容易地总结,因为如果用户是交易的发送方或接收方,你不需要根据它来决定方向。当系统中出现错误的货币时,你可以很容易地通过单腿交易建模存款和取款
顺便说一句,你不应该在这里使用用户。使用帐户就像用户可以共享帐户一样(例如公司)任何用户都可能有多个帐户。当然,用户并不真正感兴趣,重要的是钱。你的恩惠是否总是与之相关联的奖励?恩惠的意义是什么?为什么它是一个交易字段?真正的问题。如果我只是想给某人寄钱,而不是一个恩惠,而是一笔债务呢heers使用了这个,但做了一些小的修改(基于Matzi的评论),但它按预期工作。