kouの技術的メモ

学習した内容の定着やアウトプット用に開設しました

成果物の作成2作品目④ 予定管理サービス スケジュール関係のモデルの作成

スケジュール関係のモデルの実装です。

今回もissueを作ります。

DBモデル作成

モデルですが、これがかなり悩んで紆余曲折試行錯誤した結果以下で行くことにしました。

Userモデル(登録ユーザ情報)omniauth-twitterに合わせて中身を作ります。

主キー 名前 プロバイダー(ツイッター ツイッターUID ツイッター写真
integer型 string型 string型 string型 string型
id user_name :provider uid image_url

DayScheduleモデル(その日の予定)

外部キー 主キー 一日の予定
integer型 integer型 string型|integer
User_id day_schedule_id day_schedule


TimeScheduleモデル(時間辺りの予定)

外部キー 主キー 時間辺りの予定名 始まりの時間 終わりの時間
integer型 integer型 string型 time型or string型 time型or string型
DaySchedule_id time_schedule_id time_schedule start_time end_time


モデルの作成

3つのモデルを作ることにしましたが、各モデルの関係性を表すとこうなります。

  • User → 1対多 → DaySchedule

  • User ← 1対1 ← DaySchedule

  • DaySchedule  → 1対多 → TimeSchedule

  • DaySchedule  ← 1対1 ← TimeSchedule

Userモデルはもう作ってあるので、

まず上記の関係性に従ってScheduleモデルを作っていきます。

DayScheduleモデル

以下のコマンドを入力します

rails g modelDaySchedule  day_schedule:integer schedule:string user:references

作成されたモデルにバリデーションを付けていきます。

schedule_per_day.rb

class SchedulePerDay < ApplicationRecord
  belongs_to :user
  has_many :time_schedule, dependent: :destroy
  validates :user_id, presence: true
  validates :schedule ,presence: true,length: { maximum: 255 }
end

予定名day_scheduleは255文字までしか入れない仕様なので、length: { maximum: 255 }を追加します。

SchedulePerDayモデルテスト

そしてモデルに対するテストを書きます。

schedule_per_day_test.rb

require 'test_helper'

class SchedulePerDayTest < ActiveSupport::TestCase
  
  def setup
    @user = users(:user)
    @schedule_per_day = @user.schedule_per_days.build(schedule: "Lorem ipsum",day_of_the_week: 1)

  end
  
  test "should be valid" do
    assert @schedule_per_day.valid?
  end

  test "user id should be present" do
   @schedule_per_day.user_id = nil
    assert_not @schedule_per_day.valid?
  end
  
    test "day_of_the_week should be present " do
    @schedule_per_day.day_of_the_week = nil
    assert_not @schedule_per_day.valid?
    end
    
  test "day_of_the_week should be in 0^6" do
    @schedule_per_day.day_of_the_week = 10
    assert_not @schedule_per_day.valid?
  end
  
  test "schedule should be present" do
    @schedule_per_day.schedule = nil
    assert_not @schedule_per_day.valid?
  end
  
  test "shedule should be at most 255" do
    @schedule_per_day.schedule = "a" * 256
  assert_not @schedule_per_day.valid?
  end

テストはgreenになりましたので、SchedulePerDayモデルは完成です!

SchedulePerTimeモデル

同様にSchedulePerTimeモデルを制作します

rails g model TimeSchedule  TimeSchedule:string start_time:string end_time:string user:references

作成されたモデルにバリデーションを付けていきます。

schedule_per_time.rb

class SchedulePerTime < ApplicationRecord
  belongs_to :schedule_per_day
  validates :Schedule_per_day_id, presence: true
  validates :schedule_per_one, presence: true,length: { maximum: 255 }
  validates :start_time ,presence: true
  validates :end_time ,presence: true
  
end

validates :start_time ,presence: trueと validates :end_time ,presence: trueの部分はまだ完全に決まってないので、後で追加するかもしれません。

SchedulePerTimeモデルテスト

そしてモデルに対するテストを書きます。

schedule_per_time_test.rb

class SchedulePerTimeTest < ActiveSupport::TestCase
  
  def setup
    @schedule_per_day = schedule_per_days(:one)
    @schedule_per_time = @schedule_per_day.schedule_per_time.build(schedule_per_one: "Lorem ipsum", start_time: "01:00", end_time: "01:00")
  end
  
  test "should be valid" do
    assert @schedule_per_time.valid?
  end

  test "schedule_per_day_id should be present" do
    @schedule_per_time.schedule_per_day_id= nil
    assert_not @schedule_per_time.valid?
  end
  
  test "schedule_per_one should be present" do
    @schedule_per_time.schedule_per_one = nil
    assert_not @schedule_per_time.valid?
  end
  
  test "schedule_per_one be at most 255" do
   @schedule_per_time.schedule_per_one = "a" * 256
  assert_not @schedule_per_time.valid?
  end
  
  test "srtart_time should be present " do
    @schedule_per_time.start_time= nil
    assert_not @schedule_per_time.valid?
  end
    
  test "end_time should be present " do
    @schedule_per_time.end_time= nil
    assert_not @schedule_per_time.valid?
  end
  
end

こちらもGreenで完成です!