教材の内容に関係のない質問や教材とは異なる環境・バージョンで進めている場合のエラーなど、教材に関係しない質問は推奨していないため回答できない場合がございます。
その場合、teratailなどの外部サイトを利用して質問することをおすすめします。教材の誤字脱字や追記・改善の要望は「文章の間違いや改善点の指摘」からお願いします。
この章ではリストを作成・編集・削除する機能を実装していきます。作成・編集・削除する機能はWebアプリケーション開発をする上で基本的なことです。この章でwebアプリケーション開発の基本的なことを学んでいきましょう。
本パートでは、Listモデルを作成し、アソシエーションの設定まで行います。
では実際に進めていきましょう。
リスト機能を作成するにはデータベースにリストの情報を保存する処理が必要になります。
なのでまずデータベースのやり取りを行うモデルを作成していきます。
リスト作成に必要な情報は以下の2つになります。
Copied!- リストのタイトル
- 誰が投稿したかリストの情報
この2つの情報を格納するためにlistsテーブルを作成します。
listsテーブル構成は以下のようになります。
カラム名 | データ型 |
---|---|
title | string |
user | references |
references型で保存すると、user_idを外部キーとして明示的に指定できます。
外部キーとは関連したテーブルの間を結ぶために設定する列のことです(今回でいうとlistsテーブルとusersテーブル)。
モデルを作成するには、rails g model モデル名
というコマンドでモデルを作成できます。
では、Listモデルを作成するに以下のコマンドを実行してください。
Copied!$ rails g model List
上記のコマンドで新しくマイグレーションファイルも作成されます。
早速その作成されたマイグレーションファイルを以下のように編集してください。
Copied!db
└── migrate
└── xxxxxx_create_lists.rb
db/migrate/xxxxxx_create_lists.rb12345678910111213 Copied!class CreateLists < ActiveRecord::Migration[6.0]
def change
create_table :lists do |t|
# ==========ここから追加する==========
t.string :title, null: false
t.references :user, foreign_key: true, null: false
# ==========ここまで追加する==========
t.timestamps
end
end
end
ruby1 Copied!t.references :user, foreign_key: true, null: false
references型はカラム名+"_id"がテーブル名として設定されるので、今回listsテーブルにはuser_id
というカラムが追加されます。
foreign_key: true
は外部キーとして使用するということを示しています。
では、マイグレーションファイルを実行してlistsテーブルを作成します。
Copied!$ rails db:migrate
上記のコマンドを実行すると下記のような実行結果が表示されます。
Copied!== 20190727025624 CreateLists: migrating ======================================
-- create_table(:lists)
-> 0.0017s
== 20190727025624 CreateLists: migrated (0.0019s) =============================
モデルを作成したらアソシエーションの設定を行います。
アソシエーションとは、2つのモデル同士のつながりを指します。モデルとモデルの間には関連付けを行う必要があります。
参考)Active Record の関連付け (アソシエーション)
まずUserモデルとListモデルのアソシエーションを設定していきます。
上記2つのモデルの関係性は以下のようになります。
Copied!- ユーザーは複数のリストを作成することができる
- リストAに関して、リストAを作成したユーザーは一人しかいない
このような関係のことを「1対多の関係」と言います。
では、app/models/user.rb
に以下のコードを追加してください。
Copied!app
└── models
└── user.rb
app/models/user.rb123456789101112 Copied!class User < ApplicationRecord
# この行を追加
has_many :lists, dependent: :destroy
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
validates :name, presence: true, length: { maximum: 20 }
end
ruby1 Copied!has_many :lists, dependent: :destroy
has_many
は、他のモデルとの間に「1対多」のつながりがあることを示します。(「1側」にhas_manyを追加します。)
has_manyが使用されている場合、「反対側」のモデルでは多くの場合belongs_to
が使われます。
またdependent: :destroy
をつけることで、オブジェクトが削除されるときに、関連付けられたオブジェクトのdestroyメソッドが実行されます。つまり今回で言うと、ユーザーが削除されたら、そのユーザーに紐づくリストも削除します。
参考)Active Record の関連付け (アソシエーション) :dependent
次にapp/models/list.rb
に以下のコードを追加してください。
Copied!app
└── models
└── list.rb
app/models/list.rb123456 Copied!class List < ApplicationRecord
# ここに追加
belongs_to :user
end
これでUserモデルとListモデルのアソシエーション設定ができました。
値がデータベースに保存される前に、そのデータが正しいかどうかを検証する仕組みをバリデーションといいます。
今回はリストのタイトルの文字数が1文字以上255文字以下であるかどうかを検証するバリデーションを追加します。
app/models/list.rb
に以下のコードを追加してください。
Copied!app
└── models
└── list.rb
app/models/list.rb123456 Copied!class List < ApplicationRecord
belongs_to :user
# ここに追加
validates :title, length: { in: 1..255 }
end
length
は属性の値の長さを検証するメソッドです。
以上で今回のパートは終了です。
お疲れさまでした。