📘 hkob-astro-notion-blog

これまではてなブログにて情報発信をしていましたが、令和5年3月22日より、こちらでの情報発信を始めました。2019年以前の古い記事は過去の Middleman 時代のものなので、情報が古いです。記録のためだけに残しています。

event モデルの作成 - 不定期刊 Rails App を作る(29)

💡
この記事は Middleman 時代に書いた古いものです。記録のため、astro-notion-blog に移行していますが、あまり参考にしないでください。

ある程度一通りの機能が作れたため,その他のモデルを追加していく.

event モデルの追加
  1. generator で event モデルを作成する.
    $ bin/rails g model event name:string date:date sort_order:integer kurasu_id:integer
    Running via Spring preloader in process 23848
          invoke  active_record
          create    db/migrate/20181213020027_create_events.rb
          create    app/models/event.rb
          invoke    rspec
          create      spec/models/event_spec.rb
          invoke      factory_bot
          create        spec/factories/events.rb
  2. db/migrate/*_create_events.rb を修正する. 各属性は null: false にすることと,kurasu_id, date, sort_order の組に index を付けると共に,plural unique を設定する.
    class CreateEvents < ActiveRecord::Migration[5.2]
      def change
        create_table :events do |t|
          t.string :name, null: false
          t.date :date, null: false
          t.integer :sort_order, null: false
          t.integer :kurasu_id, null: false
          t.timestamps
        end
        add_index :events, %i[kurasu_id date sort_order], unique: true
      end
    end
  3. migrate する
    bin/rails db:migrate
event_spec の記述

spec/models/event_spec.rb を修正する.

require 'rails_helper'

RSpec.describe Event, type: :model do

  context 'common validation check' do
    subject { event_factory :start2300_0406 }

    it_behaves_like :presence_validates, %i[name kurasu_id date sort_order]
    #it_behaves_like :unique_validates, %i[], -> { event_factory :other }
    it_behaves_like :plural_unique_validates, %i[kurasu_id date sort_order], -> { event_factory :hr3300_0413 }
    it_behaves_like :destroy_validates
    #it_behaves_like :reject_destroy_validates
    it_behaves_like :belongs_to, :event, has_many: %i[kurasu]
    it_behaves_like :dependent_destroy, :event, %i[kurasu]
    #it_behaves_like :reject_destroy_for_relations, :event, %i[has_many has_one]
    #it_behaves_like :destroy_nullify_for_relations, :event, %i[has_many has_one]
  end

  context 'after some events are registrered' do
    model_keys = %i[hr2300_0406 start2300_0406 hr3300_0413]
    let!(:targets) { event_factories model_keys }

    describe 'Event class' do
      subject { Event }

      it_behaves_like :mst_block, -> t do
        {
          order_date_desc_sort_order: [nil, t.values_at(2, 1, 0)],
        }
      end

      #it_behaves_like :msta_block, -> t do
      #  {
      #    method1: [v1, a1, v2, a2, ...],
      #    method2: [v1, a1, v2, a2, ...],
      #  }
      #end
      #it_behaves_like :mst, :METHOD1, -> { [v1, event_factories(model_keys.values_at()), v2, event_factories(model_keys.values_at())] }
      #it_behaves_like :msta, :METHOD1, -> { [v1, event_factories(model_keys.values_at()), v2, event_factories(model_keys.values_at())] }
    end

    context 'Event instances' do
      subject { targets }

      #it_behaves_like :amst_block, -> t do
      #  {
      #    method1: [v1, a1, v2, a2, ...],
      #    method2: [v1, a1, v2, a2, ...],
      #  }
      #end
      #
      #it_behaves_like :amsta_block, -> t do
      #  {
      #    method1: [v1, a1, v2, a2, ...],
      #    method2: [v1, a1, v2, a2, ...],
      #  }
      #end
      #it_behaves_like :amst, :METHOD1, -> { [v1, a1, v2, a2] }
      #it_behaves_like :amsta, :METHOD1, -> { [v1, a1, v2, a2] }
    end
  end
end

event model の記述
  1. app/models/event.rb を記載する.
    class Event < ApplicationRecord
      validates :name, :kurasu_id, :date, :sort_order, presence: true
      validates :sort_order, uniqueness: {scope: %i[kurasu_id date]}
    
      # @return [Kurasu] 関連するクラス
      belongs_to :kurasu
    
      scope :order_date, -> { order arel_table[:date] }
      scope :order_date_desc, -> { order(arel_table[:date].desc) }
      scope :order_sort_order, -> { order arel_table[:sort_order] }
      scope :order_date_desc_sort_order, -> { order_date_desc.order_sort_order }
    
    end
  2. 関連する app/models/kurasu.rb に has_many を追加する.
    class Kurasu < ApplicationRecord
      (中略)
      # @return [Array<Event>] 関連するイベント一覧
      has_many :events, dependent: :destroy

長くなったので今日はここまで