gpt4 book ai didi

ruby-on-rails - 在 Rails 3 模型中缓存一个复杂的计算

转载 作者:数据小太阳 更新时间:2023-10-29 08:01:53 24 4
gpt4 key购买 nike

我是 Ruby/Rails 的新手,所以这可能(希望)是一个我不知道答案的简单问题。

我在 Rails 中实现了一个会计/计费系统,我试图跟踪每笔交易后的运行余额,以便将其显示在如下 View 中:

Date     Description     Charges($)   Credits($)    Balance($)
Mar 2 Activity C $4.00 -$7.50
Feb 25 Payment for Jan $8.00 -$3.50
Feb 23 Activity B $1.50 -$11.50
Feb 20 Activity A $2.00 -$10.00

Each transaction (also known as line item) is stored in the database, with all the values above (Date, Description, Amount) except for the Balance. I can't store the balance for each transaction in the database because it may change if something happens to an earlier transaction (a payment that was posted subsequently failed later for example). So I need to calculate it on the fly for each line item, and the value for the Balance for a line item depends on the value for the line item before it (Balance = Balance of Prev Line Item + Amount for this Line Item, i.e.)

So here's my question. My current (inept) way of doing it is that in my LineItem model, I have a balance method which looks like :

def balance
prev_balance = 0
#get previous line items balance if it exists.
last_line_item = Billing::LineItem.get_last_line_item_for_a_ledger(self.issue_date,self.ledger_item_id)

if last_line_item
prev_balance = last_line_item.balance
.. some other stuff...
end

prev_balance + (-1*net_amount) # net_amount is the amount for the current line item
end

这是非常昂贵的,而且我的 View 需要永远加载,因为我一次又一次地计算上一个订单项的余额。执行此操作的更好方法是什么?

最佳答案

您基本上是在为不想在每笔交易中存储余额而付出代价。您可以使用索引优化数据库并使用缓存等;但从根本上说,如果您有很多交易,您会遇到计算余额需要很长时间的问题。

请记住,您将继续获得新的交易,因此您的问题会随着时间的推移而变得更糟。

您可以考虑多种设计方案。首先,就像 Douglas Lise 提到的那样,您可以在每笔交易中存储余额。如果出现较早日期的交易,则意味着您可能必须更新自该日期以来的几笔交易。但是,这有一个上限(取决于您要允许的“旧”交易),因此它有一个合理的最坏情况行为。

或者,您可以执行协调步骤。每个月您都会“结账”超过 X 周的交易。对帐后,您存储计算出的余额。在 def balance 中,您现在可以使用现有逻辑,但也可以引用“上次对帐后的余额”。这再次提供了合理且可预测的最坏情况。

关于ruby-on-rails - 在 Rails 3 模型中缓存一个复杂的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5200709/

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