MySQLのenumとRailsのenum
enumとは
enumとは列挙型の事です。
定数を名前空間でまとめたものと自分は認識してます。
ほとんどの場合enumは可視性のために使われます。
定数でも同じ機能は実装できるのですが(実装だけなら定数の方が楽)、コードを書くと何を使ってるのか分かりにくくなってしまうからです。以下のリンクにとても分かりやすくまとめてありました。
今さら聞けないenumの基本編を解説javatechnology.net
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で使う
はじめはRailsのモデルにenumで値を設定したらマイグレートした時にMySQLにenum付きのカラムが作成されると思っていたのですが、
MySQLのenumのインデックスが0から自動で振られる事と、Railsのenumがハッシュで自由に指定できることがうまく結びつかずに悩みました。
実際調べるとMySQLに挿入する値をRails(ActiveRecord)で制御しているのみで、MySQL側でenumの設定をしているわけではない事がわかりました。
以下はRails(ActiveRecord)のソースです。