日記のデータを管理するモデル、データベースを作成していきます。テーブル設計は下記の表のようになっています。※start_time
には日付が入ります。
user: references
は各日記がどのユーザーに紐づいているのかを判定するためのカラムの作成です。これによってuser_id
を追加し、user_id
カラムに紐づくusers
テーブルのレコードIDを記録していきます。
Sayo-MacBook-Pro:emoji_diary SAYO$ bundle exec rails generate model diary feeling:string body:string start_time:date, user:references
Running via Spring preloader in process 22273
invoke active_record
create db/migrate/20210525053327_create_diaries.rb
create app/models/diary.rb
作成されたマイグレーションファイルのfeeling
カラムとstart_date
カラムにnull制約、start_date
カラムにunique
制約をかけました。
class CreateDiaries < ActiveRecord::Migration[6.1]
def change
create_table :diaries do |t|
t.string :feeling, null: false
t.string :body
t.date :start_time, null: false
t.references :user, null: false, foreign_key: true
t.timestamps
end
add_index :diaries, :start_time, unique: true
end
end
Sayo-MacBook-Pro:emoji_diary SAYO$ bundle exec rails db:migrate
== 20210525053327 CreateDiaries: migrating ====================================
-- create_table(:diaries)
-> 0.0906s
-- add_index(:diaries, :start_time, {:unique=>true})
-> 0.0454s
== 20210525053327 CreateDiaries: migrated (0.1362s) ===========================
次にDiaryモデルのバリデーションを作成します。もし入力された日付が未来だった場合にエラーを吐くようにバリデーションを設置しました。
class Diary < ApplicationRecord
belongs_to :user
#感情を表す絵文字は必須
validates :feeling, presence: true
#日記の日付は必須、一日一記事の制限
validates :start_time, presence: true, uniqueness: true
# 定義したメソッドを設定
validate :start_time_cannot_be_in_the_future
# 生年月日の未来日のチェックメソッド
def start_time_cannot_be_in_the_future
# 日時が入力済かつ未来日(現在日付より未来)
if start_time.present? && start_time > Date.today
# エラー対象とするプロパティとエラーメッセージを設定
errors.add(:start_time, "can not specify your future date as date.")
end
end
end
https://yuruli.info/rails5-custom-validation/
UserモデルにDiaryモデルとのアソシエーションを追加します。
class User < ApplicationRecord
# Diaryモデルとのアソシエーション、ユーザーが消されたら日記も消す
has_many :diaries, dependent: :destroy
end
ここでもう一つバリデーションをつけたいです。私の作成しているアプリケーションでは、feeling
カラムとbody
カラムには絵文字しか入力してはいけない、またfeeling
カラムは1文字、body
カラムは5文字までという設定にしたいです。
文字数の制限から行っていきます。
# 感情を表す絵文字は1つのみ必須
validates :feeling, presence: true, length: { maximum: 1 }
# 出来事を表す絵文字を5つまで入力できる
validates :body, length: { maximum: 5 }