Ruby on rails 确保用户的完整性';s';余额';在Rails应用程序中

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

“余额”表示贷项和借项之和之间的差额。以下简化模式代表了一个示例:

请注意“余额”列。我确定了三种确定平衡的方法:

(1) 在更新贷记或借记表(以及更新余额)时,请将代码包装在一个表中。例如:

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

通过这种方式,您可以确保在添加贷方或借方时,余额会被更新,因为它包含在同一贷方/借方移动对象中。

谢谢您的回答。不幸的是,我的简化用例并没有反映出贷项和借项必须在单独的表中。在我的应用程序中,“借记”表示用户的购买。此购买属于某个项目。”“信用”表示用户通过信用卡存入资金的交易(此表还需要额外的“授权”栏)。这两个表——交易和购买——在逻辑上是不同的,不应该合并到一个模型中。很抱歉没有在我的问题中解释这一点-我试图让事情变得简单以增加清晰度。