我们需要生成报告来提取大量数据、运行一些计算并将它们作为更大表格的一部分输出。做到这一点并不难。但是,使现有方法可以使用而不生成 1000 条 SQL 查询要困难得多。
例如,我可能有一个Account
具有如下方法的类:
def balance_at(time=Time.now)
payments_out = self.payments.where("created_at <= ?",time).sum("amount")
payments_in = self.payments_on_account.where("created_at <= ?",time).sum("amount")
payments_in - payments_out
end
这可用于在月初和月底获取帐户余额。它工作得很好。
但是,如果我想要一张包含Account
月初和月底所有余额的表格,事情就会变得很愚蠢。例如:
Account.includes(:payments, :payments_on_account)
如果我想纯粹在 Ruby 中处理这一切,将获得我需要的所有数据,但是我的好小方法balance_at
并不能在 Ruby 中完成所有的数字处理(这对于个别情况来说会很慢)。
我可以用 Ruby 和 SQL 中的东西来解决它,具体取决于缓存的内容,如下所示:
def balance_at(time=Time.now)
payments_out, payments_in = [payments, payments_on_account].map{|payments|
if payments.loaded?
payments.find_all{|p| p.created_at < time }.inject(0){|a,p| p.amount + a }
else
payments.where("created_at <= ?",time).sum("amount")
end
}
payments_in - payments_out
end
但是,这也不是很容易阅读或易于测试。
你会怎么解决?