如何对与活动记录轨道相关的列求和

时间:2015-09-12 06:46:14

标签: ruby-on-rails activerecord

我对关系中的2列求和有疑问,记录如下:

#<RequestProduct id: 26, request_id: 27, product_service_id: 9, quantity: 12, created_at: "2015-09-12 04:58:19", updated_at: "2015-09-12 04:58:19">,
#<RequestProduct id: 27, request_id: 27, product_service_id: 10, quantity: 11, created_at: "2015-09-12 04:58:19", updated_at: "2015-09-12 04:58:19">,
#<RequestProduct id: 28, request_id: 27, product_service_id: 11, quantity: 10, created_at: "2015-09-12 04:58:20", updated_at: "2015-09-12 04:58:20">

我想在型号ProductService上对模型RequestProduct的数量求和。我试过用一些方法但仍然失败了,就像我这样使用的方式:

@request.request_products.sum("quantity * request_products.product_service.price")
@request.request_products.sum("quantity * product_service.price")
@request.request_products.sum("quantity * ?", product_service.price)

还有其他办法吗?

2 个答案:

答案 0 :(得分:0)

你需要尝试这样的事情:

res = @request.request_products.joins(:product_services)
        .select("sum(request_products.quantity) as quantities, sum(product_services.price * request_products.quantity) as total")

现在您可以通过以下方式访问总和值:

res.quantities # total quantity
res.total      # total amount

答案 1 :(得分:0)

一种方法,它使Rails相当不可见,是在数据库中定义一个视图来连接表,执行算术,甚至可能聚合数字。

通过公开基础表的相应键id列并为视图创建模型(将其标记为只读),您可以将其视为常规Rails模型,并将所有复杂性推送到数据库层。 / p>

有些开发人员会讨厌这个问题,因为有人认为它会将业务逻辑转移到他们不熟悉的数据库层。另外,仅仅使用它来简单地连接表和乘法值可能不是一个足够强大的用例,如果你需要聚合,赞成的参数可能会变得更强。

然而,它不是复杂的逻辑,Rails级别和系统性能的简单性可能是任何其他方法所无法比拟的。