Railsのenumで定義した値がenum内の値かどうかを検証する

こんにちは!kossyです!




さて、今回はRailsにおいて、enumで定義した値がenum内の値かどうかを検証する方法について、
ブログに残してみたいと思います。




環境
Ruby 2.5.1
Rails 5.2.3



サンプル


例えば下記の実装があったとします。

class Article
  enum status: [:draft, :published, :dropped]
end

このような実装をしていた時に、
「ブラウザから送られてきたパラメータがenumで定義した値のいずれかでなければ、エラーを返す」
という実装を行いたいとします。

普通に実装すると

raise StandardError unless [:draft, :published, :dropped].include?(params[:status])

みたいになるかと思うのですが、

Enumで定義した値は、
Article.statuses(モデル名.enumで定義したカラムの複数形)とすると、

{ "draft": 0, "published": 1, "dropped": 2 }

という返り値を得ることができるので、keysメソッドと合わせて、

raise StandardError unless Article.statuses.keys.include?(params[:status])

と書くことができます。
Railsっぽくていいですね!