如何计算Campaign模型的总价格?现有代码报错求解
问题分析与解决方案
你的代码报错是因为campaign.items.sum(item.price * item.quantity)中的item是未定义变量,而且ActiveRecord的sum方法如果直接传表达式(而非块),需要用数据库能识别的字段名语法。下面提供两种可行方案:
方案一:数据库层面计算(推荐)
直接让数据库计算总价,性能更优,尤其数据量大时:
def campaign_subtotal(campaign) campaign.items.sum('price * quantity') end
如果想避免硬写SQL字符串,用Arel更安全(防止SQL注入):
def campaign_subtotal(campaign) item_table = Item.arel_table campaign.items.sum(item_table[:price].multiply(item_table[:quantity])) end
方案二:Ruby内存层面计算
如果已经将campaign.items加载到内存中,可用Enumerable的sum方法(带块):
def campaign_subtotal(campaign) campaign.items.sum { |item| item.price * item.quantity } end
注意:这种方式会把所有item对象加载到内存,数据量大时性能不如数据库层面的方案。
内容的提问来源于stack exchange,提问作者user3074558
相关产品推荐
相关产品推荐

