我正在尝试建模一个事务(与SQL事务无关),它对这些用例“负责”:
一个建议是在Transaction模型上使用以下属性:sender_id,receiver_id和favor_id。在这种情况下,前两个用例将具有与user(sender_id和receiver_id)和favor_id设置为nil相关的字段之一,这有点违背了belongs_to的目的(Transaction属于receiver,sender和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的存在将表明它是存款/取款还是支付佣金。
这两个中的哪一个听起来更合理?
答案 0 :(得分:1)
也许是这样的:
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
答案 1 :(得分:1)
我在财务应用方面有一些经验。在该系统中,我们使用“两条腿”进行交易的双方。一条腿有一个负数,另一条有一个正面,取决于方向,也是一个金融交易将两者结合在一起。通过这种方式,您可以轻松地在帐户上汇总腿,而无需为其他方面烦恼。似乎有点多余(它是),但它更像旧书保持习俗,你可以更容易地总结,因为如果用户在发送或接收方,你不需要根据它来决定方向这笔交易。当资金大量出现在系统中时,您可以通过单腿交易轻松地对存款和取款进行建模。
顺便说一下,你不能在这里使用用户。使用帐户作为用户可以共享帐户(例如公司),任何用户可以拥有多个帐户。当然,用户并不是很有趣,重要的是钱。