Diaryモデル作成

日記のデータを管理するモデル、データベースを作成していきます。テーブル設計は下記の表のようになっています。※start_timeには日付が入ります。

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d085c9f2-5cbf-4f27-8a59-fc86deeb1012/_2021-05-25_10.37.48.png

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 }