gpt4 book ai didi

ruby-on-rails - 什么是 'Rails Way'实现数据动态上报系统

转载 作者:数据小太阳 更新时间:2023-10-29 07:32:26 25 4
gpt4 key购买 nike

介绍

我正在做一个系统,其中我有一个非常简单的布局,只包含事务(使用基本的 CRUD)。每笔交易都有日期、类型、借方金额(减)和贷方金额(加)。想想网上银行对帐单,仅此而已。

我遇到的问题是让我的 Controller 变瘦,并担心可能会过度查询数据库。

一个简单的报告示例

  • 所选期间的总借记,例如SUM(debit) 作为 total_debit
  • 所选期间内的总信用额度,例如SUM(credit) 作为 total_credit
  • 总计total_credit - total_debit

  • 报告必须允许动态日期范围,例如where(date BETWEEN 'x' and 'y')

  • 日期范围永远不会超过一年,一次最多只能有 1000 个事务/行

所以在我创建的 Controller 中:

def report
@d = Transaction.select("SUM(debit) as total_debit").where("date BETWEEN 'x' AND 'y'")
@c = Transaction.select("SUM(credit) as total_credit").where("date BETWEEN 'x' AND 'y'")
@t = @c.credit_total - @d.debit_total
end

其他问题信息

我的实际报告有接近 6 或 7 个数据库查询(例如,根据类型 == 1 或类型 == 2 等提取总贷方/借方)并且有更多的计算,例如总计某些贷方/借方类型和然后从其他总计中添加和删除这些总计。

我尽最大努力坚持“瘦模型,胖 Controller ”,但我的 Controller 需要传递给 View 的变量数量有问题。在您创建要传递给 View 的变量之前,Rails 看起来非常简单。除了将变量创建行放入 Controller 并通过将一些查询点点滴滴放入模型中使其变得“更瘦”之外,我看不出你还能怎么做。

在模型中创建变量然后让 Controller 将它们传递给 View 时,我是否遗漏了什么?

最佳答案

在 Activerecord 中编写查询的更惯用的方式可能是这样的:

class Transaction < ActiveRecord::Base
def self.within(start_date, end_date)
where(:date => start_date..end_date)
end

def self.total_credit
sum(:credit)
end

def self.total_debit
sum(:debit)
end
end

这意味着在你的 Controller 中发出 3 个查询,如果你创建数据库索引,这应该不是什么大问题,并将事务数量和时间范围限制在一个合理的数量:

@transactions = Transaction.within(start_date, end_date)
@total = @transaction.total_credit - @transaction.total_debit

最后,您还可以使用 Ruby 的 Enumerable#reduce方法通过直接遍历从数据库中检索到的交易列表来计算您的总数。

@total = @transactions.reduce(0) { |memo, t|  memo + (t.credit - t.debit) }

对于非常小的数据集,这可能会带来更快的性能,因为您只需访问数据库一次。然而,我认为第一种方法更可取,当你的数据库中的记录数量开始增加时,它肯定会提供更好的性能

关于ruby-on-rails - 什么是 'Rails Way'实现数据动态上报系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15463157/

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