今回は、Railsにおけるテーブルの作成方法について見ていきます。
この記事を読むことで、Railsでテーブルを作成する一通りの知識がつくと思います。
現在、Railsの学習を始めた方や現場に配属されたばかりの方の参考になれば幸いです。
テーブルの作成
まず、最初にユーザー(user)テーブルを作成していきます。
テーブルの作成はターミナルで行います。基本的にはこのように定義します。
$ rails model モデル名 属性名1: データ型 属性名2: データ型
モデル名以降の属性名やデータ型については、このコマンドの後にテキストエディタ上で追加・変更することができますが、Railsが自動で設定してくれるので間違いを犯さないためにも定義する時点で書いておくほうが良いでしょう。
それでは実際に作成してみます。
$ rails g model user name:string age:integer email:string
※属性値とデータ型はくっつけて書いてください。
このコマンドを実行すると、下記ファイルが作成されると思います。
invoke active_record
create db/migrate/20211101082706_create_users.rb - ①
create app/models/user.rb - ②
invoke test_unit
create test/models/user_test.rb - ③
create test/fixtures/users.yml - ④
①マイグレーションファイル
②モデルのクラスファイル
③モデルのテストファイル
④モデルのテストデータを作成する際に使用するfixtureファイル
これが作成されたマイグレーションファイルになります。
class CreateUsers < ActiveRecord::Migration[6.1]
def change
create_table :users do |t|
t.string :name
t.integer :age
t.string :email
t.timestamps
end
end
end
tableを作成したときに、カラムに対してコメントをつけることもできます。
これを行うことで、共同開発を行う時にメンバーが何をするカラムなのかがイメージつきやすくなるというメリットがあります。
class CreateUsers < ActiveRecord::Migration[6.1]
def change
create_table :users do |t|
t.string :name, comment: '名前'
t.integer :age, comment: '年齢'
t.string :email, comment: 'メールアドレス'
t.timestamps
end
end
end
データ型の種類について
次にテーブルを作成する際に、指定出来るデータ型の種類について解説します。
string | 文字列(255文字未満) |
text | 長い文字列(255文字以上) |
integer | 整数 |
float | 浮動小数 |
decimal | 精度の高い小数 |
datetime | 日時 |
timestamp | タイムスタンプ |
time | 時間 |
date | 日付 |
boolean | boolean |
赤文字で書いたものがよく使われます。
booleanには真偽値であるtrue 、falseが入ります。
timestampは、デフォルトでcreated_atとupdated_atが入るようになっています。
これらをデフォルトで設定しない場合はこのように書きます。
class CreateUsers < ActiveRecord::Migration[6.1]
def change
create_table :users do |t|
t.string :name
t.string :string
t.string :age
t.string :integer
t.string :email
t.string :string
# t.timestamps 削除する
t.datetime :created_at, null: false
end
end
end
このように記述することで、updated_atがデフォルトで作成されないようになります。
テーブルのデータ制約について
今回は主に使われる4つの制約について解説していきます。
- NOT NULL制約
- 一意性制約
- 主キー制約
- 外部キー制約
NOT NULL制約
NOT NULL制約は、特定のテーブルの属性値にNULL(空の値)が入ることを許さない制約です。
class CreateUsers < ActiveRecord::Migration[6.1]
def change
create_table :users do |t|
t.string :name, null: false #nameが空の値だと、レコードは保存できない
t.integer :age
t.string :email
t.timestamps
end
end
end
一意性制約
一意性制約は、テーブル内で重複するデータを禁止する制約です。
同一カラムに同じ値が入ることを禁止します。
class CreateUsers < ActiveRecord::Migration[6.1]
def change
create_table :users do |t|
t.string :name
t.integer :age
t.string :email, unique: true #同じemailの値は保存できない
t.timestamps
end
end
end
主キー制約
主キー制約については、主キーである属性値が必ず存在し、尚且つ重複していないことを保証する制約です。主キーは最初からRailsでテーブルを作成すると、実装されるので、今回コードは割愛します。
外部キー制約
外部キー制約は、親元の主キーを外部キーとして持っているテーブルのレコードが作成された際に、外部キーが必ず存在していなくてはいけないという制約のことを指します。
実際に新しくテーブルを作成してみようと思います。
今回はユーザーが投稿することができるBoardsテーブルを作成し、ユーザーのIDを外部キーとして持つようにしてみます。
モデル名:references としてやることで、その作成するテーブル外部キー制約が付与されます。
$ rails g model board title:string content:text user:references
を実行すると、ユーザーを外部キーともつマイグレーションファイルが作成されます。
class CreateBoards < ActiveRecord::Migration[6.1]
def change
create_table :boards do |t|
t.string :title
t.text :content
t.references :user, null: false, foreign_key: true #外部キー制約
t.timestamps
end
end
end
マイグレーションファイルの実行
$ rails db:migrate
このコマンドを実行することで、マイグレーションファイルが読み込まれて、DBにテーブルが反映されます。
テーブルのカラムの追加・削除について
$ rails g migration クラス名 カラム名:データ型
ユーザーテーブルに、サムネイル画像を保存するためのカラムを作成してみます。
- テーブルのカラム追加
$ rails g migration AddThumbnailToUsers thumbnail:string
マイグレーションファイルを確認すると、このように書かれていると思います。
class AddThumbnailToUsers < ActiveRecord::Migration[6.1]
def change
add_column :users, :thumbnail, :string
end
end
- テーブルのカラム削除
$ rails g migration RemoveAgeToUsers age:integer
class RemoveAgeToUsers < ActiveRecord::Migration[6.1]
def change
remove_column :users, :age, :integer
end
end
ファイルの修正が完了したら、同様に $ rails db:migrateを行ってください。
その他コマンドについて
- マイグレーションの状態を確認する
statusがupになっていれば、反映されており、downになっていれば、rails db:migrateを実行して反映させてください。
$ rails db:migrate:status
- データベースを初期化する
$ rails db:migrate:reset
- db/seeds/rbに書かれてあるダミーデータをデータベースに取り込む
$ rails db:seed
今回はデータベースの作成をやっていきました。
次回は開発環境でデータベースにテストデータとして、データを注入するやり方についてのブログを書いていこうと思います。
お疲れ様でした!
- 無料・簡単・片手でホームページを作成できる自社サービス Rakwi
- Web制作とアプリ開発を学べるオンラインプログラミング講座 Upstairs
- 開発,DX推進支援サービス スタートアッププラン