我有一个模型Transaction
,我需要为transactions
的子集显示许多字段上的许多计算结果。
我已经看到了两种方法,但我不确定哪种方法最好。当数据集增长和并发用户数量增加时,我会追求性能影响最小的那个。
data[:total_before] = Transaction.where(xxx).sum(:amount_before)
data[:total_after] = Transaction.where(xxx).sum(:amount_after)
...
或
transactions = Transaction.where(xxx)
data[:total_before]= transactions.inject(0) {|s, e| s + e.amount_before }
data[:total_after]= transactions.inject(0) {|s, e| s + e.amount_after }
...
编辑:where子句始终相同。
我应该选择哪一个? (还是有第三种,更好的方法?)
谢谢,P。
答案 0 :(得分:4)
不要唠叨,但是呢
transactions = Transaction.where(xxx)
data[:total_before] = transactions.sum(:amount_before)
data[:total_after] = transactions.sum(:amount_before)
?这看起来像方法1和2的优势联合:)您重用搜索结果并使用更干净的特定于rails的sum
聚合器。
PS如果您在询问是否可以依赖Rails来缓存Transaction.where(xxx)
查询的结果,我不知道。而当我不知道时,我更喜欢安全地玩。
答案 1 :(得分:4)
你真的在谈论可扩展性。
如果您正在谈论数百万行并且需要对它们进行计算,那么您认为哪个更快?
在第一种情况下,您可以使用更快的CPU,更多RAM,更快的驱动器或定期预先计算您的值来扩展数据库主机。您想要在DBM中完成的计算正是它所写的事情。
在第二种情况下,您必须扩展计算主机,可能是连接DBM和计算主机的交换机,也可能是数据库主机,因为它必须检索并推送数据。想象一下,当它处理数据时对网络的影响,以及它在执行所有操作时对计算主机CPU的影响。
我会做第一个,因为它对我来说似乎更具可扩展性。