Rails の enum で要素が重複したときの対処方法

公開日:2019-03-07
最終更新:2019-03-07

Rails のモデルで enum を使ったときにちょっとハマりました。

enum を使う場面

例えば、セレクトボックスでタスクのステータスを変更する、といった場合に、
このようにモデルに書くことができます。

enum status: { unassigned: 0, doing: 1, done: 2 }

今回のハマりどころ

enum の要素名の命名でハマってしまったのですが、
こんな感じのコードを書くと、

class Travel < ApplicationRecord  
    enum from: { tokyo: 0, osaka: 1, okinawa: 2 }  
    enum destination: { hokkaido: 0, aichi: 1, okinawa: 2 }  
end

要素名が重複しているので、以下のようなエラーが発生します。

You tried to define an enum named "destination" on the model "travel", but this will generate a instance method "okinawa?", which is already defined by another enum.

ちなみに、一見問題ないようにも見える、enum が一つしかない場合でも同様のエラーが出る場合がありました。
例えば以下のようなコードです。

class Request < ApplicationRecord  
    enum processing: { create: 0, delete: 1 }  
end

create や delete が Rails でも使われるから?と思いましたが、はっきりとはわかりませんでした。
(環境依存かも。。。)

対処方法

対処方法は至って簡単で、以下のように _prefix をつけてあげると解決します。

class Travel < ApplicationRecord  
    enum from: { tokyo: 0, osaka: 1, okinawa: 2 }, _prefix: :from  
    enum destination: { hokkaido: 0, aichi: 1, okinawa: 2 }, _prefix: :dest  
end
記事が少しでもいいなと思ったらクラップを送ってみよう!
18
+1
@toyocyの技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする