👻

Ruby2.7でNoMethodError: undefined method `new' for BigDecimal:Classの対応

2022/03/13に公開

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.newBigDecimal() に置き換えてあげる必要があります。

対応方法1

今回問題に挙げているエラーはインスタンス取得時に起きており、それはgem mysql2のバージョンが古いことが原因でした。
mysql2 0.5.0の変更BigDecimal.newBigDecimal() に置き換えているので、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"

参考

https://tech.recruit-mp.co.jp/server-side/post-19932/

Discussion