👻
Ruby2.7でNoMethodError: undefined method `new' for BigDecimal:Classの対応
Railsで作られたアプリケーションをRuby2.7に上げたときに、decimal型のカラムを持つインスタンスを取得するとNoMethodError: undefined method `new' for BigDecimal:Class エラーが起きるようになったので調査しました。原因と対応方法について記載します。
根本的な原因
Ruby2.7からRubyで使われているgem bigdecimalのバージョンが2.0.0になっています。
2.0.0の変更点には Remove BigDecimal.new と書かれています。
つまりRuby2.7からBigDecimal.new
は使えないということです。BigDecimal.new
は BigDecimal()
に置き換えてあげる必要があります。
対応方法1
今回問題に挙げているエラーはインスタンス取得時に起きており、それはgem mysql2のバージョンが古いことが原因でした。
mysql2 0.5.0の変更で BigDecimal.new
を BigDecimal()
に置き換えているので、mysql2を0.5.0以上にアップデートすることで、インスタンス取得時のエラーは解消することができます。
Call BigDecimal(num) instead of BigDecimal.new(num)
対応方法2
何かしらの理由があってmysql2のバージョンアップができない場合は、次の方法で対応できます。
bigdecimalのバージョンを2.0.0未満にすればBigDecimal.newは使えるので、例えばGemfileに以下のように指定してbundle installします。
gem "bigdecimal", "1.4.4"
参考
Discussion