如何在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