ruby-on-rails – 实现数据动态报告系统的’Rails方式’是什么?

ruby-on-rails – 实现数据动态报告系统的’Rails方式’是什么?,第1张

概述介绍 我正在做一个系统,我有一个非常简单的布局,只包含事务(使用基本的CRUD).每笔交易都有日期,类型,借方金额(减号)和贷方金额(加号).想想网上银行的声明,就是这样. 我遇到的问题是保持我的控制器瘦,并担心可能过度查询数据库. 一个简单的报告示例 >所选期间的总借记,例如SUM(借记)为total_debit >所选期间的总积分,例如: SUM(credit)为total_credit >整 介绍

我正在做一个系统,我有一个非常简单的布局,只包含事务(使用基本的CRUD).每笔交易都有日期,类型,借方金额(减号)和贷方金额(加号).想想网上银行的声明,就是这样.

我遇到的问题是保持我的控制器瘦,并担心可能过度查询数据库.

一个简单的报告示例

>所选期间的总借记,例如SUM(借记)为total_debit
>所选期间的总积分,例如: SUM(credit)为total_credit
>整体总数,例如total_credit – total_debit
>报告必须允许动态日期范围,例如where(BETWEEN’x’和’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_totalend

附加问题信息

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

我正在努力坚持’瘦模型,胖控制器’,但是我的控制器需要传递给视图的变量数量存在问题.在创建要传递给视图的变量之前,Rails似乎非常简单.除了将变量创建行放入控制器并通过将一些查询位和部分放入模型中而使其“更瘦”之外,我不知道你是怎么做的.

在模型中创建变量然后控制器将这些变量传递给视图时,是否存在我缺少的内容?

解决方法 在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)  endend

这意味着在您的控制器中发出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方式’是什么?全部内容,希望文章能够帮你解决ruby-on-rails – 实现数据动态报告系统的’Rails方式’是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1279984.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存