我正在尝试建模一个事务(与 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 的存在将表明它是存款/取款还是支付人情。
这两个哪个听起来更合理?