Rails中为User模型添加Portfolio金额总和方法(跳过Nil值)
问题解决与代码修正
错误原因
你写的portfolios.amount.sum是错误写法:portfolios是User关联的集合对象,不是单个Portfolio记录,不能直接调用单个记录的amount属性,这就是触发内部错误的根源。
正确实现方案
我们提供两种实现方式,优先推荐数据库层面计算(性能更优):
方案1:数据库层面计算(推荐)
利用ActiveRecord的sum方法直接指定字段,SQL的SUM函数会自动忽略NULL值,无需额外处理:
def total_asset portfolios.sum(:amount) end
如果要显式过滤掉amount为nil的记录,也可以添加条件:
def total_asset portfolios.where.not(amount: nil).sum(:amount) end
方案2:Ruby内存层面计算
如果需要在Ruby端处理(比如后续要加额外逻辑),可以先提取所有amount值,移除nil后求和:
def total_asset portfolios.pluck(:amount).compact.sum end
pluck(:amount):从数据库批量取出所有amount值,返回数组compact:移除数组中的nil元素sum:对数组元素求和
修正后的完整User模型代码
class User < ApplicationRecord has_secure_password has_many :assets has_many :portfolios validates :email, :first_name, :last_name, presence: true validates :email, uniqueness: { case_sensitive: false } validates :password, length: { in: 6..20 } def total_asset portfolios.sum(:amount) end end
内容的提问来源于stack exchange,提问作者morris menanya
相关产品推荐
相关产品推荐

