gpt4 book ai didi

ruby-on-rails - 在 Rails 应用程序中确保用户 'balance' 的完整性

转载 作者:行者123 更新时间:2023-12-04 06:33:41 24 4
gpt4 key购买 nike

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

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

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

(1) 更新贷方或借方表(和更新余额)时,将代码包裹在Transaction block中.例如:

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) 创建 database view .

我将不胜感激有关以下方面的建议:
  • 每种方法的优点和缺点。
  • 替代方法。

  • 在我看来,计算余额(例如 2. 和 3.)最能确保值(value)的完整性。但是,我担心 (2) 可能会因为用户进行额外的交易而变得效率低下。数据库 View 在理论上似乎是一个合理的选择,但我不相信 rails_sql_views支持 Rails 3,我注意到有几个线程暗示数据库 View 是不可取的/通常与旧数据库相关联。

    最佳答案

    创建一个 机芯 模型。

    user_id, quantity, balance, updated_at, created_at

    中定义 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

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

    关于ruby-on-rails - 在 Rails 应用程序中确保用户 'balance' 的完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5088248/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com