【发布时间】:2023-03-23 11:53:01
【问题描述】:
简介
我正在做一个系统,其中我有一个非常简单的布局,仅包含事务(带有基本 CRUD)。每笔交易都有日期、类型、借方金额(减)和贷方金额(加)。想想网上银行对账单,就差不多了。
我遇到的问题是我的控制器很瘦,并且担心可能过度查询数据库。
一个简单的报告示例
- 所选期间的总借记,例如
SUM(debit) as total_debit - 所选期间的总信用,例如
SUM(credit) as total_credit 总体总数,例如
total_credit - total_debit报告必须允许动态日期范围,例如
where(date BETWEEN 'x' and 'y')- 日期范围永远不会超过一年,一次最多只能说 1000 个事务/行
所以在我创建的控制器中:
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 等提取总贷方/借方)并且有更多计算,例如总计某些贷方/借方类型和然后从其他总数中添加和删除这些总数。
我正在尽最大努力坚持“瘦模型,胖控制器”,但我的控制器需要传递给视图的变量数量存在问题。在您创建要传递给视图的变量之前,Rails 似乎非常简单。除了将变量创建线放入控制器并通过将一些查询点点滴滴放入模型中使其“更瘦”之外,我看不出您还能如何做到这一点。
我在模型中创建变量然后让控制器将这些变量传递给视图的地方有什么遗漏吗?
【问题讨论】:
-
一个问题太多了。请尝试将它们减少到您的前一两个,以避免混淆答案并稀释整个问题的价值。 Stack Overflow 需要简洁且定义明确的问题和答案。
-
稍后我会尝试让它变得更简单,我会做更多的搜索,因为我认为这将是一个很常见的问题,也许我太过分了并且担心太多关于瘦控制器,胖模型短语......
-
我会介绍一个
TransactionReporter对象,它应该执行它需要的查询并处理所有计算,当您执行 ActiveRecord 查询时,它们基本上返回 ruby 数组,因此您可以将该数据存储在实例中报告对象上的变量,并在所有计算完成后将其返回到视图 -
@house9 我对 Rails 有点太新了,而且它是行话(因为我来自非框架 PHP)来完全理解 TransactionReporter 对象的含义以及如何在我的示例中实现它.如果您有时间并且很容易通过答案给出一个简单的示例,那么我会非常乐意试一试并报告结果,现在我将寻求 Andrea 的答案。
-
TransactionReporter将是一个 PORO(普通的旧 ruby 对象),而不是 rails 模型或控制器 - 只需使用Andrea Fiore最初建议的内容。如果您发现 Transaction 对象开始变得过于臃肿 - 业务规则、验证、数据访问等,并且您想将报告逻辑移出到它自己的对象中,那么请这样做
标签: ruby-on-rails ruby ruby-on-rails-3.2 reporting