いよいよ最後のモデルを追加する.
$ bin/rails g model event_gakusei event_id:integer gakusei_id:integer shusseki:integer
Running via Spring preloader in process 90585
invoke active_record
create db/migrate/20181223210805_create_event_gakuseis.rb
create app/models/event_gakusei.rb
invoke rspec
create spec/models/event_gakusei_spec.rb
invoke factory_bot
create spec/factories/event_gakuseis.rb
class CreateEventGakuseis < ActiveRecord::Migration[5.2]
def change
create_table :event_gakuseis do |t|
t.integer :event_id, null: false
t.integer :gakusei_id, null: false
t.integer :shusseki, null: false
t.timestamps
end
add_index :event_gakuseis, %i[event_id gakusei_id], unique: true
end
end
bin/rails db:migrate
require 'rails_helper'
RSpec.describe EventGakusei, type: :model do
context 'common validation check' do
subject { event_gakusei_factory :start_foo }
it_behaves_like :presence_validates, %i[event_id gakusei_id shusseki]
#it_behaves_like :unique_validates, %i[], -> { event_gakusei_factory :other }
it_behaves_like :plural_unique_validates, %i[event_id gakusei_id], -> { event_gakusei_factory :hr_bar2302 }
it_behaves_like :destroy_validates
#it_behaves_like :reject_destroy_validates
it_behaves_like :belongs_to, :event_gakusei, has_many: %i[event gakusei]
it_behaves_like :dependent_destroy, :event_gakusei, %i[event gakusei]
#it_behaves_like :reject_destroy_for_relations, :event_gakusei, %i[has_many has_one]
#it_behaves_like :destroy_nullify_for_relations, :event_gakusei, %i[has_many has_one]
end
context 'after some event_gakuseis are registrered' do
model_keys = %i[hr_baz3301 hr_bar2302 start_foo]
let!(:targets) { event_gakusei_factories model_keys }
describe 'EventGakusei class' do
subject { EventGakusei }
it_behaves_like :mst_block, -> t do
{
order_number: [nil, t.reverse],
}
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_gakusei_factories(model_keys.values_at()), v2, event_gakusei_factories(model_keys.values_at())] }
#it_behaves_like :msta, :METHOD1, -> { [v1, event_gakusei_factories(model_keys.values_at()), v2, event_gakusei_factories(model_keys.values_at())] }
end
context 'EventGakusei 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
class EventGakusei < ApplicationRecord
enum shusseki: {unsettled: 0, shusseki: 1, kesseki: 2}
validates :event_id, :gakusei_id, :shusseki, presence: true
validates :gakusei_id, uniqueness: {scope: :event_id}
# @return [Event] 関連するイベント
belongs_to :event
# @return [Gakusei] 関連するイベント
belongs_to :gakusei
scope :order_number, -> { joins(:gakusei).merge(Gakusei.order_number) }
end
EventGakusei
common validation check
behaves like presence_validates
should be valid
when event_id is nil
should not be valid
when gakusei_id is nil
should not be valid
when shusseki is nil
should not be valid
behaves like plural_unique_validates
when another object has same event_id, gakusei_id
should not be valid
when another object has at least one different keys(event_id, gakusei_id)
should be valid
behaves like destroy_validates
should destroy
should change `EventGakusei.count` by -1
behaves like belongs_to
when destroying event_gakusei
event.event_gakuseis.count should decrease
gakusei.event_gakuseis.count should decrease
behaves like dependent_destroy
when destroying event
should be destroyed by dependency
when destroying gakusei
should be destroyed by dependency
after some event_gakuseis are registrered
EventGakusei class
behaves like mst_block
mst: order_number
should receive above methods(mst)
Finished in 0.55832 seconds (files took 1.3 seconds to load)
12 examples, 0 failures
長くなったので今日はここまで