railsのModelで列挙型を扱うのに、gemのenumerizeが便利です。
しかし、あまり使い方を扱った日本語の記事が無い……。
最近だと、去年(2013年)8月にQiitaのエントリーがありました。
Enumerize 使い方 - Qiita
が、この記事だと文字列型のカラムで使う場合しか書いてありません。
数値型カラムをフラグのように使っているレコードでこのgemを使う方法を書いておきます。
String型以外のカラムで使う
例えば以下のようなテーブルを、SQLの参考書などで見かけたことがある方も多いのではないでしょうか。
カラム名 | 型 | 説明 |
---|---|---|
code | char(8) | 従業員コード |
name | varchar(64) | 氏名(苗字+名前) |
sex | integer | 性別。-1:不明、0:男性、1:女性、99:その他 |
enter_at | date | 入社年度 |
ArctiveRecordなどでレコード取得した際に、「性別が0なら男で、1なら女で…」という処理を実装する時にenumerizeが活躍します。
employee.rb
class Employee < ActiveRecord::Base
extend Enumerize
enumerize :sex, in: {unkown: -1, male: 0, female: 1, other: 99}, scope: :having_status
end
Employee.with_sex(:male)
#=> SELECT "employees".* FROM "employees" WHERE "users"."sex" IN (0)
person = Employee.first
person.male? #=> false
person.female? #=> true
person.sex_text #=> 女 // i18nの設定が必要
便利ですね!
カラムに配列を使ったり、i18nと連動したり、railsのviewにラジオボタンを作ったりなど。
他にもいろいろな使い方があります
詳しくはenumerize - GithubのREADMEを見てください。
(2014/06/22追記)
- Rails4.1からはModelにenumという機能を使って列挙型を表せるようになりました
- 「そもそもActiveRecordじゃなくて、普通のrubyスクリプトで列挙型使いたいんだけど……」という人はinumが便利だと思います