成果物の作成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で完成です!