我有以下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
我们是否有更好的替代方案/解决方案?
答案 0 :(得分:1)
让我们以Arel的方式做到这一点。我将用Arel的文档中的代码片段向您概述必须完成的操作,而不是可运行的代码。
arel_table
来创建查询。对于名为Order
的模型,获取Arel表就像orders = Order.arel_table
orders.project(orders[:price].count).group(users[:delivery_status])
。请注意,您需要先按customer
分组,然后按delivery_status
分组。orders.join(insurances).on(YOUR_CONDITIONS)