ruby-on-rails – 实现数据动态报告系统的’Rails方式’是什么?
介绍
我正在做一个系统,我有一个非常简单的布局,只包含事务(使用基本的CRUD).每笔交易都有日期,类型,借方金额(减号)和贷方金额(加号).想想网上银行的声明,就是这样. 我遇到的问题是保持我的控制器瘦,并担心可能过度查询数据库. 一个简单的报告示例 >所选期间的总借记,例如SUM(借记)为total_debit 所以在我创建的控制器中: 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似乎非常简单.除了将变量创建行放入控制器并通过将一些查询位和部分放入模型中而使其“更瘦”之外,我不知道你是怎么做的. 在模型中创建变量然后控制器将这些变量传递给视图时,是否存在我缺少的内容? 解决方法
在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 这意味着在您的控制器中发出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) } 对于非常小的数据集,这可能会导致更快的性能,因为您只会访问数据库一次.但是,我认为第一种方法更可取,当数据库中的记录数量开始增加时,它肯定会提供更好的性能 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |