如何在Rails应用程序中添加BigDecimal值

在Rails 3.2应用程序中,我定义了两种执行计算并返回大小数值的方法。

Def Func1 Model1.price * Model1.qty End Def Func2 Model2.price * Model2.qty End 

我不知道这是否相关,但是:qty字段是一个计数器缓存列,记录了相关has_many记录的数量。

我现在想要计算Func1和Func2的总和。 如果我试试

 Def FuncTotal Func1 + Func2 End 

它返回连接的两个值,而不是总和。 即如果Func1 = 15.45且Func2 = 24.76,则FuncTotal = 15.4524.76。

我也试过了

 Def FuncTotal Func1.to_s + Func2.to_s End 

但这也是连接起来的。

我假设发生此问题是因为计算基于BigDecimal值。 在这种情况下,我觉得价格*数量计算返回正确的产品似乎很奇怪。

如何将两个BigDecimal值一起添加?

非常感谢

编辑

这是一个示例控制台输出

 > 1=Model1.find(1) => # 2.Model2.find(2) => # 1total=1.func1 => [#] > 2.total=2func2 => [#] > 1+2 => [#, #] 

奇怪!

编辑

我的列定义如下。

两种型号的价格相同

 t.decimal "price", :precision => 12, :scale => 2 

两种型号的数量大致相同

 t.integer "model1_children_count", :default => 0 

并在儿童模型中

 belongs_to :model1, :counter_cache => true 

编辑

完整的Func1和Func2如下所示,位于has_many Model1s和Model2s的父模型中。

 Class Parent def total_cost_of_model1 model1s.collect { |model1s| model1.price * model1.quantity } end end 

你的总成本函数是调用collect ,它返回一个数组,当连接时会返回一个连接数组。 如果要使用“+”添加它,则必须返回正确的类型(BigDecimal)

你确定他们是BigDecimals吗? 我实际上在这里得到了正确的行为。

 irb(main)> a = BigDecimal.new("1") => # irb(main)> b = BigDecimal.new("2") => # irb(main)> c = a + b => # irb(main)> c.to_i => 3