Rails 4通过查询按货币计算总金额并计算

时间:2017-08-10 10:11:42

标签: mysql ruby-on-rails group-by

您好我已经给出了查询

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美元 请指导我如何获取它。

1 个答案:

答案 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

虽然不是每个人的口味,但我确定。