您好我已经给出了查询
refund1 = Spree::Order.joins(:refunds).group('currency').sum(:total)
=> {"USD"=>#<BigDecimal:7f896ea15ed8,'0.17641E4',18(18)>, "SGD"=>#<BigDecimal:7f896ea15d98,'0.11184E3',18(18)>, "EUR"=>#<BigDecimal:7f896ea15ca8,'0.1876E3',18(18)>}
2.2.1 :212 >
refund1 = Spree::Order.joins(:refunds).group('currency').count
=> {"USD"=>2, "SGD"=>1, "EUR"=>2}
refund1.each do |k,v| refund1[k]=[v,refund2[k]] end
=> {"USD"=>[2, #<BigDecimal:7f896f1d83a0,'0.17641E4',18(18)>], "SGD"=>[1, #<BigDecimal:7f896f1d3fa8,'0.11184E3',18(18)>], "EUR"=>[2, #<BigDecimal:7f896f1d3aa8,'0.1876E3',18(18)>]}
refund1 = Spree :: Order.joins(:退款).group('currency')。sum(refund.amount)
这不起作用我需要将退款金额归入订单总额
我也需要取日期,即在02-08-2017两个订单退还100美元 请指导我如何获取它。
答案 0 :(得分:0)
Rails / ActiveRecord适用于相对简单的分组,您可以对多个属性进行分组,而不仅仅是currency
,但是将函数应用于其中一个分组值并返回多个聚合(求和和计数)需要一些努力。
除非你在select子句select("date_trunc(...), currency, sum(...), count(...)")
中开始指定SQL片段或者开始使用Arel(对我总是看起来比SQL更复杂,只有很少的兑换好处),它也不会非常高效。
我(因为我是一个SQL-ey人)会在这里试图在系统中放置一个数据库视图,在您想要的分组级别定义所需的聚合,并通过模型在Rails中引用它。
Create View spree_refund_day_currency_agg as select ....;
......和......
class Spree::RefundDayCurrencyAgg < ActiveRecord::Base
def self.table_name
spree_refund_day_currency_agg
end
def read_only?
true
end
belongs_to ....
end
然后,您可以在Rails环境中访问您的聚合数据,就好像它是一个神奇维护的数据集(类似于物化视图,没有实现),使用逻辑定义的完全灵活的方式(与RDBMS一样)在Rails中。
例如,使用模型中定义的范围
def self.bad_day_in_canada
where(currency: CANADA_CURR)
end
虽然不是每个人的口味,但我确定。