我有以下函数来汇总给定用户的:amount
模型中Pack
字段的所有记录:
user.rb
def total_money_spent_cents
amount = self.packs.map(&:amount).sum
return amount
end
但是,当我使用此功能时,我收到以下错误:
nil can't be coerced into Fixnum
有什么建议吗?
修改 我在测试中仍然遇到有关Fixnum的问题,还有另一个问题打开here。
答案 0 :(得分:9)
这表明您的某个包中有一个尚未设置的金额字段,因此nil
也是如此。当你尝试将它添加到其他东西时,它会经历类型强制,看看Ruby是否可以将其类型按到可以添加到数字中的类型,但它不能,所以你有这个错误。
一个解决方案就是:
def total_amount_spent_cents
packs.map(&:amount).compact.sum
end
Array#compact
删除了nil
元素。
这可能是修复症状而不是实际问题。情况可能是你根本不应该有nil
,在这种情况下你应该检查Pack
模型的初始化(或者可能是它的验证,确保amount
是强制性的。)
答案 1 :(得分:0)
我为Array和Hash添加了一些额外的方法:它们就像compact
但它们删除了blank?
返回true的所有值,而不仅仅是nil:所以会删除空字符串,空数组,哈希等。
class Hash
def compact_blank!
self.each{|k,v| self.delete(k) if v.blank? }
self
end
def compact_blank
self.dup.compact_blank!
end
end
class Array
def compact_blank!
self.delete_if(&:blank?)
end
def compact_blank
self.dup.compact_blank!
end
end
使用
["1", "abc", "", nil, []].compact_blank
=> ["1", "abc"]
它特别适用于params,你可能会获得很多空字符串。