Rails 4とRails 5におけるEnumerizeの挙動の違い

RailsEnumerize のバージョン違いで AR::Base.update_all(attr: :undefined_enum) の振る舞いが異なるというものがあったので記しておく。

以下のようなコードがあるとする。なお、musics.genre カラムは NOT NULL とする。

class Music < ActiveRecord::Base
  extend Enumerize

  enumerize :genre, in: %i(classic jazz metal)
end

enumerize で列挙していない :melodic_speed_metal という値を使って Music.update_all(genre: :melodic_speed_metal) を実行すると次のような違いがある。

  • Rails 4.2.7.1 と Enumerize 1.1.1 ... mesics.genre カラムに 'melodic_speed_metal' という値が入る
  • Rails 5.0.0.1 と Enumerize 2.0.1 ... 列挙していない値について Enumerize が nil を返すため NOT NULL 違反のエラーとなる

どちらかといえば Rails 5 での振る舞いの方が期待しないデータが作られる確度が低まるので、早めにアップグレードできると幸せになれそう。