2

“余额”表示贷方总和与借方总和之间的差额。以下简化架构代表一个示例:

架构 http://dl.dropbox.com/u/10177092/Personal/stackoverflow_question.png

注意“余额”栏。我已经确定了三种确定平衡的方法:

(1) 在更新贷方或借方表(以及更新余额)时,将代码包装在Transaction 块中。例如:

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_sql_views支持 Rails 3,而且我注意到有几个线程暗示数据库视图是不可取的/通常与遗留数据库相关联。

4

1 回答 1

3

创建一个运动模型。

user_id, quantity, balance, updated_at, created_at

在User模型中定义 add_credit、add_debit 和 balance 实例方法:

 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

在运动模型中使用 after_save 回调:

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

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

于 2011-02-23T08:30:07.913 回答