0
0

More than 1 year has passed since last update.

初心者向け enum の導入

Posted at

既存のusersテーブルにenumを導入しようとしたら色々課題があったので記事にしました。
ユーザーの性別や年齢層をセレクトボックスで入力できる仕様にしたい。

  • deviseによりログイン機能が実装されている
  • 以下のusersテーブル
カラム名 データ型 備考
email string deviseにより導入済み
password string deviseにより導入済み
nickname string deviseに追加した
gender integer deviseに追加した
age integer deviseに追加した

enum の設定

Userモデルにenumの定義をしていく。

models/user
class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :rememberable, :validatable
         with_options presence: true do
          validates :nickname
          validates :gender
          validates :age
        end

#~~以下を追加~~
     enum gender: {
    man: 0,
    woman:1,
 }
 enum age: {
    teens: 0,
    twenties:1,
    thirties:2,
    forties:3,
    fifties:4,
    sixties:5,
    seventies:6,
    eighties:7,
    nineties:8
 }
#~~以上を追加~~
end
schema
ActiveRecord::Schema.define(version: 2022_07_17_114402) do
  
  enable_extension "plpgsql"

  create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.datetime "remember_created_at"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.string "nickname", null: false
    t.integer "gender", null: false
    t.integer "age", null: false
    t.index ["email"], name: "index_users_on_email", unique: true
  end

end

まずはgender ageにデフォルト値を設定する

正直デフォルト値については現時点(2022/07/18)で理解はできていないがおそらくデータベースに余計なデータが入らない様にする設定だと思われる。nilやnullはデータベースでは特別な扱いらしいので不要なトラブルを避けるためにも設定をしておく。
設定するためには直接マグレーションファイルに書き込むのではなく新規マイグレーションファイルを作成してから反映させなければならない。

既存のテーブルにオプションを追加するために新規マイグレーションファイルを作成

ターミナル
rails g migration setting_is_gender_age_default_on_users

今回はuserテーブルのgender,ageカラムのデフォルト値をセッティンするので、マイグレーションファイル名はAdd_Is_Gender_Age_Default_On_Usersとします。
作成されたマイグレーションファイルにデフォルト値を追加していきます

新規マイグレーションファイル
class AddIsGenderAgeDefaultOnUsers < ActiveRecord::Migration[6.1]
  def change
    change_column_default :users, :gender, from: nil, to: 0
    change_column_default :users, :age, from: nil, to: 0
  end
end

マイグレーションファイルに修正を加えたらデータベースへ反映

ターミナル
rails db:migrate

キチンと反映されているのかschemaファイルとrails dbで確認してみる

schema.rb
ActiveRecord::Schema.define(version: 2022_07_19_030658) do
  
  enable_extension "plpgsql"

  create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.datetime "remember_created_at"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.string "nickname", null: false
    t.integer "gender", default: 0, null: false   #←default: 0,が追加されている
    t.integer "age", default: 0, null: false            #←default: 0,が追加されている
    t.index ["email"], name: "index_users_on_email", unique: true
  end

end
ターミナル
rails db
↓入力待ちになったら以下を入力
\d users

      Column        |              Type              | Collation | Nullable |              Default              
---------------------+--------------------------------+-----------+----------+-----------------------------------
 id                  | bigint                         |           | not null | nextval('users_id_seq'::regclass)
 email               | character varying              |           | not null | ''::character varying
 encrypted_password  | character varying              |           | not null | ''::character varying
 remember_created_at | timestamp without time zone    |           |          | 
 created_at          | timestamp(6) without time zone |           | not null | 
 updated_at          | timestamp(6) without time zone |           | not null | 
 nickname            | character varying              |           | not null | 
 gender              | integer                        |           | not null | 0  ←追加されてる!
 age                 | integer                        |           | not null | 0  ←追加されてる!
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
    "index_users_on_email" UNIQUE, btree (email)

動作確認

セレクトボックス

一覧表示ページの作成

一旦ここで中断

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