Railsのステータスを表すinteger型のカラムにはenumが便利

f:id:ihatov08:20160712153036j:plain
顧客管理でusersテーブルに男性、女性などを判断するinteger型のカラムを追加することありますよね?それをviewで簡単に男性、女性と表示させるときはenumを使うと簡単に実装できます。

 たとえばusersテーブルにsexカラムが存在して、integer型で格納するとします。0だったら女性、1だったら男性としてデータベースに登録し、判断します。

    create_table "customer_users", force: :cascade do |t|
t.string   "name",                                 null: false
t.string   "email",                                null: false
t.text     "profile"
t.integer  "sex",                                  null: false
end

integer型なので、もちろん数字でデータベースには格納されます。
でも、viewで「男性」、「女性」と表示したい時があります。
そんなときはmodelファイルでenumを使うと便利です。

enum:activerecord

app/models/user.rb

class User < ActiveRecord::Base
enum sex: [:female, :male]
end

modelでenumを定義すると、viewで男性、女性と表示することが容易になります。

app/views/users/show.html.erb

sexに男性を表す1が格納されていると...
@user.sex #=> 男性

注意しなければならないのは、後でenumに属性を追加したときです。たとえば、オカマを追加してみましょう。

app/models/user.rb

class User < ActiveRecord::Base
enum sex: [:okama, :female, :male]
end

先頭に追加してしまうとテーブルに格納されている0でokamaを参照することになります。今まで0で女性を参照できていましたが、女性が全員オカマになってしまいます。
それを防ぐには後ろに追加する必要があります。

app/models/user.rb

class User < ActiveRecord::Base
enum sex: [:female, :male, :okama]
end

enumをI18nに対応するにはymlファイルに以下のように定義します。

ja.yml

ja:
user_sex:
female: 女性
male: 男性

viewでは以下のように呼び出します。

I18n.t("user_sex.#{@user.sex}")

他にも便利な使い方があるので、参考にしてみてください。

enum:activerecord

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です