Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Rails中建模半金融交易_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 如何在Rails中建模半金融交易

Ruby on rails 如何在Rails中建模半金融交易,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我正在尝试建模一个事务(与SQL事务无关),它“负责”这些用例: 用户可以在预付费账户上存款 用户也可以从同一帐户中提款 一个用户可以向另一个用户汇款 一个建议是在事务模型上使用以下属性:发送者\ id、接收者\ id和偏好\ id。在这种情况下,前两个用例将有一个与用户(发送者\ id和接收者\ id)和偏好\ id相关的字段设置为nil,这有点违背了属于\ id的目的(交易属于接收方、发送方和受惠方)。以下是此版本的代码片段: class Transaction < ActiveR

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

  • 用户可以在预付费账户上存款
  • 用户也可以从同一帐户中提款
  • 一个用户可以向另一个用户汇款
一个建议是在事务模型上使用以下属性:发送者\ id、接收者\ id和偏好\ id。在这种情况下,前两个用例将有一个与用户(发送者\ id和接收者\ id)和偏好\ id相关的字段设置为nil,这有点违背了属于\ id的目的(交易属于接收方、发送方和受惠方)。以下是此版本的代码片段:

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的评论),但它按预期工作。