在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)
=> #<Model1 id:1......
> 2.Model2.find(2)
=> #<Model2 id:2....
> 1total=1.func1
=> [#<BigDecimal:10a5cd888,'0.25E4',9(36)>]
> 2.total=2func2
=> [#<BigDecimal:10a5c7348,'0.5E3',9(36)>]
> 1+2
=> [#<BigDecimal:10a5cd888,'0.25E4',9(36)>, #<BigDecimal:10a5c7348,'0.5E3',9(36)>]
奇怪!
修改
我的列定义如下。
两种型号的价格相同
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
答案 0 :(得分:2)
您的总成本函数调用collect
,它返回一个数组,当连接时将返回一个连接数组。如果要使用“+”
答案 1 :(得分:0)
你确定他们是BigDecimals吗?我实际上在这里得到了正确的行为。
irb(main)> a = BigDecimal.new("1")
=> #<BigDecimal:102773230,'0.1E1',9(18)>
irb(main)> b = BigDecimal.new("2")
=> #<BigDecimal:100dd1a48,'0.2E1',9(18)>
irb(main)> c = a + b
=> #<BigDecimal:1026502e0,'0.3E1',9(27)>
irb(main)> c.to_i
=> 3