如何根据轨道中的某些条件准备结果

时间:2015-02-02 10:42:32

标签: ruby-on-rails ruby-on-rails-4 join activerecord

我有以下3种模式(订单,保险,捐赠)。

 #order.rb
has_one :donations 
has_one :insurances

 #insurance.rb
belongs_to :order

 #donation.rb
belongs_to :order

现在我各自的表格中包含以下数据:

 #Order
id customer_id  delivery_status  price 
1    10          true            50
2    10          true            60
3    10          false           70
4    10          false           80
5    10          true            90
6    10          true            10

 #insurance
id token  order_id
1   ABC     3

 #donation
id  amount order_id
1      10    4

现在,我需要为每个客户准备最终报告,其中包括身份证明,交付物品的总价格,未交付物品的总价格,金额(来自捐赠),代币(来自保险)。

在最终结果中我需要这样的东西:

customer_id  total_price_of_delivered  total_price_of_undelivered amount token
1             50+60+90+10=250                  150            10    ABC
2             xxxx                             xxx           XXX      XXX

目前我正在尝试使用以下代码库:

result = Order.includes(:insurance, :donation)

delivered_items_price = 0 
undelivered_items_price = 0 
result.each do |order| 
 customer_id = order.customer_id 
  # will loop through all orders based on conditions. 
  #then put the fetched result in an array of hash. 
end

我们是否有更好的替代方案/解决方案?

1 个答案:

答案 0 :(得分:1)

让我们以Arel的方式做到这一点。我将用Arel的文档中的代码片段向您概述必须完成的操作,而不是可运行的代码。

  1. 我们将使用arel_table来创建查询。对于名为Order的模型,获取Arel表就像orders = Order.arel_table
  2. 一样简单
  3. 获取与分组相结合的列的总和就像orders.project(orders[:price].count).group(users[:delivery_status])。请注意,您需要先按customer分组,然后按delivery_status分组。
  4. 由于我们需要在最终结果中包含多个总和,因此您需要使用Common Table Expressions(CTE)。有关详细信息,请查看文档和this answer
  5. 最后,您将结果与其他表一起加入。例如。 orders.join(insurances).on(YOUR_CONDITIONS)