DesignAssembler

備忘録に近い

MySQLのenumとRailsのenum

enumとは

enumとは列挙型の事です。

定数を名前空間でまとめたものと自分は認識してます。

ほとんどの場合enumは可視性のために使われます。

定数でも同じ機能は実装できるのですが(実装だけなら定数の方が楽)、コードを書くと何を使ってるのか分かりにくくなってしまうからです。以下のリンクにとても分かりやすくまとめてありました。

今さら聞けないenumの基本編を解説
javatechnology.net

qiita.com

MySQLで構築する

MySQLでのenumは簡単に言うと、データベースに数値で挿入して、表示するときは分かりやすい文字列で取り出せるものです。

mysqlで実際に使ってみます

mysql> create table enum_test(name enum(‘Tarou’,’Hanako’,’Jirou’));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into enum_test(name) values('Tarou');
Query OK, 1 rows affected (0.00 sec)

mysql> select * from enum_test;
+-------+
| name  |
+-------+
| Tarou |
+-------+
1 row in set (0.00 sec)

mysql> insert into enum_test(name) values(‘Saburou’);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from enum_test;
+-------+
| name  |
+-------+
| Tarou |
|       |
+-------+
2 rows in set (0.00 sec)

mysql> insert into enum_test(name) values (2);
Query OK, 1 row affected (0.00sec)

mysql> select * from enum_test;
+--------+
| name   |
+--------+
| Tarou  |
|        |
| Hanako |
+--------+
3 rows in set (0.00 sec)

mysql> select * from enum_test where name = 1;
+-------+
| name  |
+-------+
| Tarou |
+-------+
1 row in set (0.00 sec)

mysql> select * from enum_test where name = 'Tarou';
+-------+
| name  |
+-------+
| Tarou |
+-------+
1 row in set (0.00 sec)

enumで指定された文字列には指定した順にインデックスがつきます。 ここでは、{’Tarou’ => 1, ‘Hanako’ => 2, ‘Jirou’ => 3}のようになります。

このインデックス値を使ってinsertすることもselectすることもできます。

Railsで使う

RailsenumMySQLenumは別物です。

はじめはRailsのモデルにenumで値を設定したらマイグレートした時にMySQLenum付きのカラムが作成されると思っていたのですが、
MySQLenumのインデックスが0から自動で振られる事と、Railsenumがハッシュで自由に指定できることがうまく結びつかずに悩みました。

実際調べるとMySQLに挿入する値をRails(ActiveRecord)で制御しているのみで、MySQL側でenumの設定をしているわけではない事がわかりました。

以下はRails(ActiveRecord)のソースです。

github.com

Railsenumを使う方法は以下のリンクにとても分かりやすくまとめてありました。

ruby-rails.hatenadiary.com

sugamasao.hatenablog.com