假设有下表:
Product(id:integer, category:string, cost:float)
并且您希望使用activerecord
执行此查询:
Product.select("cost + 1000 AS incremented_cost").group(:category).sum('incremented_cost')
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "incremented_cost" does not exist
该示例非常简化,但它很好地代表了问题:如何为修改后的字段分配别名并将其用于聚合函数?
我的目标是返回一个Activerecord_Relation,它可以在别名字段上计算聚合,可能在一个组上。问题是“分组”是有条件的,我想保留数据管道。
select
方法不起作用,因为它不会更改关系的字段名称。如果使用“AS”,则可以访问别名(请参阅链接)。但是它在聚合函数中不起作用。
请参阅:http://apidock.com/rails/v4.1.8/ActiveRecord/QueryMethods/select
使用#inject
对我来说这不是一个好的解决方案,我不想处理数组。
例如,这段代码给出了正确的结果,但对我来说这不是一个好的解决方案:
Product.select("cost + 1000 AS incremented_cost").inject(0) do |acc, record|
acc + record.incremented_cost
end