Techioz Blog

レールの列挙では nil 値は許可されません

概要

プロジェクトで enumerize gem を使用していますが、nil 値を許可したい列にそれを追加すると、テストは中断されますが、コンソールへの挿入は中断されません。

MY_TYPES = ['foo',
            'baz',
            'bar'].freeze

enumerize :my_column, in: MY_TYPES,
                      default: nil,
                      scope: :shallow,
                      presence: false

my_column に nil 値を追加しようとすると、ActiveRecord 検証が表示されます。

*** ActiveRecord::RecordInvalid Exception: Validation failed: My tipes is not included in the list

ただし、Rails コンソールから値を変更すると、問題なく nil 値を割り当てることができます。

私は、allow_blank: true、allow_nil: true、そして最近では present: false オプションを試してきました。

助けていただければ幸いです。

解決策

ドキュメントに従って、包含検証はデフォルトで追加されます。 Skip_validation を追加してから、allow_nil 包含検証を自分で追加する必要があります。

enumerize :my_column, in: MY_TYPES, skip_validations: true, ...
validates :my_column, inclusion: MY_TYPES, allow_nil: true

ラムダを含めることもできることに今気づきました。そのため、(テストされていませんが)これを(個別の検証を追加することなく)実行できるはずです。

enumerize :my_column, in: MY_TYPES, skip_validations: -> { _1.my_column.nil? }