"не может конвертировать BigDecimal в строку" на Ruby 1.9.2p290, но не на 1.9.3p0 - PullRequest
1 голос
/ 24 января 2012

У меня есть сценарий с кодом, подобным следующему:

extracted_data = data.map{|row| ((row.some_long_number.to_f) if BigDecimal(row.some_long_number) != BigDecimal("-1500.0")) }.reverse

Когда я запускаю это на Rails 3.1.x с ruby ​​1.9.3, это работает нормально, однако, когда я переношу это на Heroku Cedar с той же версией Rails, но ruby ​​1.9.2, я получаю следующее исключение:

can't convert BigDecimal into String

app/controllers/some_controller.rb:12:in `BigDecimal'
app/controllers/some_controller.rb:12:in `block (2 levels) in index'
app/controllers/some_controller.rb:12:in `map'
app/controllers/some_controller.rb:12:in `block in index'
app/controllers/some_controller.rb:3:in `new'
app/controllers/some_controller.rb:3:in `index'

Что может происходить здесь с ruby ​​1.9.2 до 1.9.3, которое это отключает?

1 Ответ

2 голосов
/ 24 января 2012

Из списка изменений Ruby:

  • bigdecimal / bigdecimal.c (BigDecimal_new): поддержка создания нового BigDecimal из другого BigDecimal с использованием глобальной функции BigDecimal или конструктор. [Рубин-Dev: 44245]

Я подозреваю, что BigDecimal(row.some_long_number) делает BigDecimal того, что уже BigDecimal. Конструктор принимает строку, поэтому он пытается привести BigDecimal к строке. Изменение в 1.9.3 допускает это, но 1.9.2 нет.

Так что вы можете сделать что-то вроде:

row.some_long_number.respond_to?(:to_s) ? BigDecimal(row.some_long_number) : row.some_long_number

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...