Как добавить значения BigDecimal в приложение Rails - PullRequest
1 голос
/ 03 марта 2012

В приложении 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.В этом случае мне кажется странным, что вычисление цены * qty возвращает правильный продукт.

Как я могу добавить два значения 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 приведен ниже, он находится внутри родительской модели, которая имеет_модели Model1s и Model2s.

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

Ответы [ 2 ]

2 голосов
/ 04 марта 2012

Ваша функция общей стоимости вызывает collect, которая возвращает массив, который при объединении возвращает объединенный массив.Вы должны вернуть правильный тип (BigDecimal), если хотите добавить его, используя «+»

0 голосов
/ 03 марта 2012

Вы уверены, что они 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...