しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Rails4.1未満でカラムを列挙型として扱えるGem「enumerize」

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の場合もTyponilが入ってくれます。
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での利用方法や更なる便利機能の調査も機会あれば行っていきたいと思います。