Ruby on rails 确保用户的完整性';s';余额';在Rails应用程序中
“余额”表示贷项和借项之和之间的差额。以下简化模式代表了一个示例: 请注意“余额”列。我确定了三种确定平衡的方法: (1) 在更新贷记或借记表(以及更新余额)时,请将代码包装在一个表中。例如:Ruby on rails 确保用户的完整性';s';余额';在Rails应用程序中,ruby-on-rails,database-design,transactions,marketplace,balance,Ruby On Rails,Database Design,Transactions,Marketplace,Balance,“余额”表示贷项和借项之和之间的差额。以下简化模式代表了一个示例: 请注意“余额”列。我确定了三种确定平衡的方法: (1) 在更新贷记或借记表(以及更新余额)时,请将代码包装在一个表中。例如: ActiveRecord::Base.transaction do current_user.credits.credit(100) current_user.balance.increment(100) end (2) 不要包含“余额”列-而是在每次请求时计算余额: credit = cur
ActiveRecord::Base.transaction do
current_user.credits.credit(100)
current_user.balance.increment(100)
end
(2) 不要包含“余额”列-而是在每次请求时计算余额:
credit = current_user.credits.sum('amount')
debit = current_user.debits.sum('amount')
balance = credits - debits
(3) 创建一个
我希望得到以下方面的建议:
- 每种方法的优缺点
- 备选办法
在我看来,计算余额(如2和3)最能确保价值的完整性。然而,我担心(2)可能会变得效率低下,因为用户参与了额外的事务。从理论上讲,数据库视图似乎是一个合理的选择,但我认为它不支持Rails 3,我注意到有几个线程暗示数据库视图是不受欢迎的/通常与传统数据库关联。创建一个移动模型
user_id, quantity, balance, updated_at, created_at
在用户模型中定义添加贷方、添加借方和余额实例方法:
def add_credit(quantity)
self.movements.create :quantity => quantity
end
def add_debit(quantity)
self.movements.create :quantity => -quantity
end
def balance
self.movements.last.balance
end
before_save :update_balance
def update_balance
if balance
balance = self.user.movements.last.balance + self.quantity
else
balance = self.quantity # First movement
end
end
在移动中使用after_save回调模型:
def add_credit(quantity)
self.movements.create :quantity => quantity
end
def add_debit(quantity)
self.movements.create :quantity => -quantity
end
def balance
self.movements.last.balance
end
before_save :update_balance
def update_balance
if balance
balance = self.user.movements.last.balance + self.quantity
else
balance = self.quantity # First movement
end
end
通过这种方式,您可以确保在添加贷方或借方时,余额会被更新,因为它包含在同一贷方/借方移动对象中。谢谢您的回答。不幸的是,我的简化用例并没有反映出贷项和借项必须在单独的表中。在我的应用程序中,“借记”表示用户的购买。此购买属于某个项目。”“信用”表示用户通过信用卡存入资金的交易(此表还需要额外的“授权”栏)。这两个表——交易和购买——在逻辑上是不同的,不应该合并到一个模型中。很抱歉没有在我的问题中解释这一点-我试图让事情变得简单以增加清晰度。