0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

enumの使用方法/使用例

Posted at

環境

・Ruby 2.6.4

・Rails 5.2.3

enum(enumeration: 列挙)とは

・数値のカラムの対してプログラム上で別名を与える役割。

・名前を整数の定数に割り当てるのに使われるデータ型

・名前に数値を割り当てることで、コードの可読性を上げて、かつ不要な不具合を防いでくれるもの

・ActiveRecord::EnumはRails 4.1で導入された。enumの属性値はデータベース内の整数に対応付けられるが、クエリでは名前で参照できる。

・• enum型の定数は定義されている以外の値を受け付けない(例外が発生)

使用方法

1.usersテーブルにenum用のカラム(roleカラム,データ型はinteger型)を追加

2.userモデルにenumの定義をする

1.usersテーブルにenum用のカラム(roleカラム,データ型はinteger型)を追加

rails g migration AddRoleToUsers
class AddRoleToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :role, :integer, null: false, default: 0
  end
end

#null: falseにしているのは奴隷/王様は必ず必要なため
#初期値は奴隷にしたいので、default: 0
rails db:migrate

2.userモデルにenumの定義をする

app/model/user.rb

class User < ApplicationRecord
  
  
  
  enum role: { slave: 0, king: 1 }
end

・roleカラムに数値が保存される

・数値によって奴隷か王様か区別

コンソールで確かめていく

pry(main)> User.roles
=> {"slave"=>0, "king"=>1}

key,valueも指定して取得できるようになる

pry(main)> User.roles.keys
=> ["slave", "king"]

pry(main)> User.roles.values
=> [0, 1]

King(王様)にする方法は

コンソール上で

pry(main)> user = User.first
 id: 1
 email: "tenshin@example.com"
 first_name: "メイウェザー"
 last_name: "フロイド"
 role: "slave"

pry(main)> user.king!

pry(main)> user.king?
=> true

とすることでkingにすることができる

使用例

プルダウン形式のフォームは通常、下記のようにf.selectを用いる。

<%= f.select カラム名, {'選択肢': DBに保存する値}, {オプション}, {classなどの要素} %>

keyをそのまま使う場合 to_a

<%= f.select :role, User.roles.keys.to_a, {}, class: 'form-control' %>

モデルクラス.enumカラム名の複数形でハッシュ形式で取得できる。

User.roles
=> {"slave"=>0, "king"=>1}

.to_aメソッドはハッシュを配列に変換するメソッド

日本語化してみよう

gem 'enum_help'

bundle install

config/locales/activerecord/ja.yml

ja:
  enums:
    user:
      role:
        slave: '奴隷'
        king: '王様'

日本語化したのを呼び出す方法

・カラムの後に_i18nを付ける

・ただ、モデルに対して呼び出すときはカラムは複数形。

・モデルのインスタンスなどを呼び出すときのカラムは単数形。

User.roles_i18n
=> {"slave"=>"奴隷", "king"=>"王様"}

@user.role_i18n
=> "王様"

valueである数値(0,1)が日本語になる

enum_helpを利用して記述すると

<%= f.select :role, User.roles_i18n.invert, {}, class: 'form-control' %>

=> {"奴隷"=>"slave", "王様"=>"king"}

.invertメソッドでkeyとvalueが入れ替えられるよって、下記のように値である0(奴隷)や1(王様)がDBに保存される

もしinvertメソッドを使用しないと

<%= f.select :role, User.roles_i18n, {}, class: 'form-control' %>

=> {"slave"=>"奴隷", "king"=>"王様"}

となりkeyが保存されることになるので。プルダウン方式のところに日本語化されていない(slave or king)が表示されてしまう

奴隷や王様で一般/管理者を表すと少し面白い。。

参考 https://zenn.dev/yusuke_docha/articles/89b49fd29c16c6

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?