如何在Rails ActiveRecord中对计算列posi_price求和?
解决Position模型中计算列总和的问题
错误原因
你遇到的问题是因为posi_price是查询中定义的别名,并非数据库实际存在的列。当调用.sum(:posi_price)时,Rails会直接生成SUM(posi_price)的SQL语句,数据库无法识别这个别名,因此报错。
可行解决方案
方案1:直接在sum中使用计算表达式(推荐)
让数据库直接计算总和,这是最高效的方式:
Position.where(vat_type_id: vat_type.id, invoice_id: @invoice.id).sum('amount * price')
对应的SQL会是:
SELECT SUM(amount * price) FROM "positions" WHERE "positions"."vat_type_id" = ? AND "positions"."invoice_id" = ?
方案2:在模型中封装计算逻辑(适合复用)
如果需要多次使用这个计算逻辑,可以在Position模型中定义一个类方法:
class Position < ApplicationRecord belongs_to :invoice belongs_to :vat_type def self.total_posi_price sum('amount * price') end end
调用时:
Position.where(vat_type_id: vat_type.id, invoice_id: @invoice.id).total_posi_price
方案3:Ruby层面求和(不推荐大数据量)
如果需要先获取所有计算后的数值再求和,可以用pluck配合Ruby的sum方法,但数据量大时性能不如数据库直接计算:
Position.select('amount * price AS posi_price') .where(vat_type_id: vat_type.id, invoice_id: @invoice.id) .pluck(:posi_price) .sum
内容的提问来源于stack exchange,提问作者Ricky883249
相关产品推荐
相关产品推荐

