地方でリモートワーク in Iwate

東京の受託開発会社でリモートワークしてます。

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