弥生開発者ブログ弥生開発者ブログ2015-08-10ActiveRecordのenumで気をつけたい3つのポイント初投稿の@sunflatです。ついて、ちょっと調べてみました。本当は、Misocaの開発でenumを使ってその実例を紹介する予定だったのですが、後述する理由により今回は適していなかったので使いませんでした。そこで今回は、(株)Misocaの近くにある「ムガルパレス」というインドカレー屋さんの、ランチセットのメニューを例に、enumを使う時に気をつけたいポイントをいくつか紹介します。使うと、プログラムからは文字列(名前)でアクセスでき、DBには整数値で保存される属性を作成できます。ランチセットのモデルを作成しましょう。使うためには、属性にセットできる文字列(名前)を予め列挙しておきます。endend属性(curry)を読み書きする時に、名前の文字列(chicken、porkなど)を使うことができます。DBに保存する時は整数値として保存されます。curry他にも、名前?メソッド(現在その値がセットされているかどうかを返す)、名前!メソッド(その値をセットしてsave!する)などが定義されます。対応する整数値を明示する方法ここで、ポークカレーが廃止されて、新たにシュリンプカレーが追加されたとしましょう。(ムガルパレスではどちらも注文できるので安心して下さい)単純に、名前リストから:porkを削除すると、vegitablesとbeansに対応する整数値が変わってしまうので、このような場合はHashを使って対応する整数値を明示します。個人的には、単純な連番の場合でも、最初から対応する整数値を明示しておいた方が分かりやすい気がします。複数のenum属性を持つ場合の注意せっかくのランチセットなので、飲み物も追加しましょう。メソッドが使用できます。ここで、飲み物に野菜ジュースが追加されたとしましょう。:vegitables]endしかし、このコードは、vegitablesという名前を2回使っているため、vegitables?などのメソッドが多重定義となり、エラーになります。従って、複数のenum属性を使う場合は、例えば名前に接尾辞をつけるなどして、名前がかぶらないように注意してください。:vegitables_drink]end将来追加される予定のオプションGitHubにある最新のenumの実装をみてみると、enumに_prefix、_suffixというオプションが追加され、メソッド名の接頭辞・接尾辞を指定できるようです(trueの場合は、属性名と同じになる)。時点ではリリースされていない機能ですが、先ほどのような名前がかぶる場合も、以下のようにスッキリ書けますね。ちなみに、執筆時点での最新のenumの実装はこちら対応する値は整数値のみそもそもenumについて調べたのは、Misocaにリマインダーメールの機能(新規登録時に、チュートリアルの案内が後日メールで送られてくる)を追加するためです。リマインダーメールのモデルでは、最初は以下のようにenumを使用していました。コードレビューをしてもらったところ、DBに保存する値は整数値ではなく文字列のままが良いということだったので、enumの名前に対応する値を以下のように文字列にしました。動作確認したところ、このままでも期待通りに動作したので、このままenumを使う予定でした。このブログを書くにあたってenumの実装などを確認した所、公式のRubyDocには、enumの名前に対応する値は整数値のみと書かれています。先ほど挙げた最新の実装を見ると、整数値に依存したコードも追加されているようなので、結局今回のリマインダーメールのモデルでは、enumを使うのは断念しました。追記(2016/02/03):改めて最新のenumの実装を確認した所、DBに保存する値を文字列にした場合のテストケースなどが追加されていました。整数値以外の場合にも対応する予定なのかもしれません。まとめ教訓:ライブラリの機能を使う場合は、公式のAPIドキュメントをしっかり読んで使いましょう。ちなみにムガルパレスですが、実際にはランチセットに野菜ジュースは存在しないです。ナンとライスの選択もできて、しかもナンとライスはおかわり自由です。前に背骨の手術を受けたら...2020-12-11君のプログラミング言語は輝いているかこんにちは、Misoca開発チームの黒曜(@kokuyouwind)です。し...2020-10-09Railsの複数DB機能で負荷を分散するこんにちは。開発している小坂と申します。プレビュー(言語・組み込みライブラリ編)Misoca開発チームのeitoballです。開催を指折...2015-10-30Misoca開発で日々使う知識とその情報ソースまとめ9月末に涸沢の紅葉を堪能してきた@RKTMです。弥生は第23回Quesに協賛します。引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。