enumerizeというGemを試してみたのでそのメモです。
enumerizeとは
RailsのModelで列挙型を使えるようになるGemです。
使い方
使うための手順
利用する為の手順は下の通りです。
Gemfileに追加してModelに下の2行を追加するだけ。
gem 'enumerize'
class CreateUsers < ActiveRecord::Migration def change create_table :users do |t| t.integer :sex t.timestamps end end end
class User < ActiveRecord::Base extend Enumerize enumerize :sex, in: { male: 1, female: 2} end
どういう事ができるか
下のようにシンボルで代入ができます。
数値での代入も可能。
user = User.new user.sex = :male p user.sex # → male (DBには1が入ってる) user.sex = 2 p user.sex # → female (DBには2が入ってる)
範囲外の値をセットするとエラーになります。
user = User.new user.sex = 4 user.save! # → エラー
male?
等の便利なメソッドを生やしてくれます。
user = User.new user.sex = :male p user.sex.male? # → true p user.sex.female? # → false
怖い点
Typoしてても代入できます。
この場合nilがセットされます。
user = User.new user.sex = :mal # ← Typo p user.sex # → nil
その他の使い方
enumerizeはstring型にも適用できます。
intとstring、自分はintが多いですがどちらの方が一般的なんですかね。
class CreateUsers < ActiveRecord::Migration def change create_table :users do |t| t.string :sex t.timestamps end end end
class User < ActiveRecord::Base extend Enumerize enumerize :sex, in: [:male, :female] end
user = User.new user.sex = :male p user.sex # → male
Stringの場合もTypoはnilが入ってくれます。
TypoがそのままDBに保存されない点はありがたいです。
user = User.new user.sex = :mal p user.sex # → nil user.sex = "mal" p user.sex # → nil
デフォルト値をセットする事もできます。
class User < ActiveRecord::Base extend Enumerize enumerize :sex, in: [:male, :female], default: :male end
スコープを有効にする事もできたりします。
とてもスマートですね。
class User < ActiveRecord::Base extend Enumerize enumerize :sex, in: [:male, :female], scope: true end
User.with_sex(:male)
まとめ
enumerize
は便利な機能が揃っているし機能が直感的で素晴らしいGemでした。
formでの利用方法や更なる便利機能の調査も機会あれば行っていきたいと思います。