カテゴリー
サインイン 新規登録

間違いや改善の指摘

内容の技術的な誤り・誤字脱字やミスのご報告・解説やトピックの追記/改善のご要望は教材をさらに良くしていく上でとても貴重なご意見になります。

少しでも気になった点があれば、ご遠慮なく投稿いただけると幸いです🙏

実際には誤りではなく勘違いであっても、ご報告いただけることで教材のブラッシュアップにつながります。

質問ポリシー①

教材受講者みなさんのスムーズな問題解決のために、心がけていただきたいことがあります。

教材の内容に関する質問を投稿しましょう

教材の内容に関係のない質問や教材とは異なる環境・バージョンで進めている場合のエラーなど、教材に関係しない質問は推奨していないため回答できない場合がございます。

その場合、teratailなどの外部サイトを利用して質問することをおすすめします。教材の誤字脱字や追記・改善の要望は「文章の間違いや改善点の指摘」からお願いします。

4-1

モデルの作成

この章ではリストを作成・編集・削除する機能を実装していきます。作成・編集・削除する機能はWebアプリケーション開発をする上で基本的なことです。この章でwebアプリケーション開発の基本的なことを学んでいきましょう。

本パートの目標物

本パートでは、Listモデルを作成し、アソシエーションの設定まで行います。

目標物を作成するまでの流れ

  1. モデルの作成
  2. アソシエーションの設定
  3. バリデーションの設定

では実際に進めていきましょう。

1. モデルの作成

リスト機能を作成するにはデータベースにリストの情報を保存する処理が必要になります。

なのでまずデータベースのやり取りを行うモデルを作成していきます。

image

リスト作成に必要な情報は以下の2つになります。

Copied!
- リストのタイトル - 誰が投稿したかリストの情報

この2つの情報を格納するためにlistsテーブルを作成します。

Listモデルを作成

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.rb
12345678910111213
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
ruby
1
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. アソシエーションの設定

モデルを作成したらアソシエーションの設定を行います。

アソシエーションとは、2つのモデル同士のつながりを指します。モデルとモデルの間には関連付けを行う必要があります。

参考)Active Record の関連付け (アソシエーション)

UserモデルとListモデルのアソシエーションの設定

まずUserモデルとListモデルのアソシエーションを設定していきます。

上記2つのモデルの関係性は以下のようになります。

Copied!
- ユーザーは複数のリストを作成することができる - リストAに関して、リストAを作成したユーザーは一人しかいない

このような関係のことを「1対多の関係」と言います。

image

では、app/models/user.rbに以下のコードを追加してください。

Copied!
app └── models └── user.rb
app/models/user.rb
123456789101112
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
ruby
1
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.rb
123456
Copied!
class List < ApplicationRecord # ここに追加 belongs_to :user end

これでUserモデルとListモデルのアソシエーション設定ができました。

3. バリデーションの設定

値がデータベースに保存される前に、そのデータが正しいかどうかを検証する仕組みをバリデーションといいます。

今回はリストのタイトルの文字数が1文字以上255文字以下であるかどうかを検証するバリデーションを追加します。

app/models/list.rbに以下のコードを追加してください。

Copied!
app └── models └── list.rb
app/models/list.rb
123456
Copied!
class List < ApplicationRecord belongs_to :user # ここに追加 validates :title, length: { in: 1..255 } end

lengthは属性の値の長さを検証するメソッドです。

以上で今回のパートは終了です。

お疲れさまでした。