Add column Relationship#role
This commit is contained in:
parent
c0a5e2a4ec
commit
ce51091dbd
5 changed files with 64 additions and 11 deletions
|
@ -1,7 +1,9 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class Relationship < ApplicationRecord
|
class Relationship < ApplicationRecord
|
||||||
enum status: %i[supporter member excluded]
|
enum status: %i[supporter excluded member]
|
||||||
|
|
||||||
|
enum role: %i[manager supervisor]
|
||||||
|
|
||||||
################
|
################
|
||||||
# Associations #
|
# Associations #
|
||||||
|
@ -17,4 +19,6 @@ class Relationship < ApplicationRecord
|
||||||
validates :from_date, presence: true, uniqueness: { scope: :person_id }
|
validates :from_date, presence: true, uniqueness: { scope: :person_id }
|
||||||
|
|
||||||
validates :status, presence: true
|
validates :status, presence: true
|
||||||
|
|
||||||
|
validates :role, absence: { unless: :member? }
|
||||||
end
|
end
|
||||||
|
|
|
@ -12,9 +12,9 @@ class CreateRelationships < ActiveRecord::Migration[6.0]
|
||||||
null: false, index: true, foreign_key: true
|
null: false, index: true, foreign_key: true
|
||||||
|
|
||||||
t.date :from_date, null: false, index: true
|
t.date :from_date, null: false, index: true
|
||||||
|
t.date :until_date, null: true, index: false
|
||||||
t.integer :status, null: false, index: true
|
t.integer :status, null: false, index: true
|
||||||
|
t.integer :role, null: true, index: true
|
||||||
t.date :until_date
|
|
||||||
|
|
||||||
t.index %i[person_id from_date], unique: true
|
t.index %i[person_id from_date], unique: true
|
||||||
end
|
end
|
||||||
|
@ -25,6 +25,10 @@ class CreateRelationships < ActiveRecord::Migration[6.0]
|
||||||
ALTER TABLE relationships ADD CONSTRAINT dates CHECK (
|
ALTER TABLE relationships ADD CONSTRAINT dates CHECK (
|
||||||
until_date IS NULL OR from_date < until_date
|
until_date IS NULL OR from_date < until_date
|
||||||
);
|
);
|
||||||
|
|
||||||
|
ALTER TABLE relationships ADD CONSTRAINT role CHECK (
|
||||||
|
status = 2 /* member */ OR role IS NULL
|
||||||
|
);
|
||||||
SQL
|
SQL
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -400,9 +400,11 @@ CREATE TABLE public.relationships (
|
||||||
person_id bigint NOT NULL,
|
person_id bigint NOT NULL,
|
||||||
regional_office_id bigint NOT NULL,
|
regional_office_id bigint NOT NULL,
|
||||||
from_date date NOT NULL,
|
from_date date NOT NULL,
|
||||||
status integer NOT NULL,
|
|
||||||
until_date date,
|
until_date date,
|
||||||
CONSTRAINT dates CHECK (((until_date IS NULL) OR (from_date < until_date)))
|
status integer NOT NULL,
|
||||||
|
role integer,
|
||||||
|
CONSTRAINT dates CHECK (((until_date IS NULL) OR (from_date < until_date))),
|
||||||
|
CONSTRAINT role CHECK (((status = 2) OR (role IS NULL)))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -915,6 +917,13 @@ CREATE UNIQUE INDEX index_relationships_on_person_id_and_from_date ON public.rel
|
||||||
CREATE INDEX index_relationships_on_regional_office_id ON public.relationships USING btree (regional_office_id);
|
CREATE INDEX index_relationships_on_regional_office_id ON public.relationships USING btree (regional_office_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: index_relationships_on_role; Type: INDEX; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE INDEX index_relationships_on_role ON public.relationships USING btree (role);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: index_relationships_on_status; Type: INDEX; Schema: public; Owner: -
|
-- Name: index_relationships_on_status; Type: INDEX; Schema: public; Owner: -
|
||||||
--
|
--
|
||||||
|
|
|
@ -10,10 +10,7 @@ FactoryBot.define do
|
||||||
end
|
end
|
||||||
|
|
||||||
status { :supporter }
|
status { :supporter }
|
||||||
end
|
role { nil }
|
||||||
|
|
||||||
factory :member_relationship, parent: :supporter_relationship do
|
|
||||||
status { :member }
|
|
||||||
end
|
end
|
||||||
|
|
||||||
factory :excluded_supporter_relationship, parent: :supporter_relationship do
|
factory :excluded_supporter_relationship, parent: :supporter_relationship do
|
||||||
|
@ -23,4 +20,16 @@ FactoryBot.define do
|
||||||
factory :excluded_member_relationship, parent: :member_relationship do
|
factory :excluded_member_relationship, parent: :member_relationship do
|
||||||
status { :excluded }
|
status { :excluded }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
factory :member_relationship, parent: :supporter_relationship do
|
||||||
|
status { :member }
|
||||||
|
end
|
||||||
|
|
||||||
|
factory :manager_relationship, parent: :member_relationship do
|
||||||
|
role { :manager }
|
||||||
|
end
|
||||||
|
|
||||||
|
factory :supervisor_relationship, parent: :member_relationship do
|
||||||
|
role { :supervisor }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -21,4 +21,31 @@ RSpec.describe Relationship do
|
||||||
describe '#status' do
|
describe '#status' do
|
||||||
it { is_expected.to validate_presence_of :status }
|
it { is_expected.to validate_presence_of :status }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#role' do
|
||||||
|
context 'for supporter relationship' do
|
||||||
|
subject { create :supporter_relationship }
|
||||||
|
|
||||||
|
it { is_expected.to validate_absence_of :role }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'for excluded supporter relationship' do
|
||||||
|
subject { create :excluded_supporter_relationship }
|
||||||
|
|
||||||
|
it { is_expected.to validate_absence_of :role }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'for excluded member relationship' do
|
||||||
|
subject { create :excluded_member_relationship }
|
||||||
|
|
||||||
|
it { is_expected.to validate_absence_of :role }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'for member relationship' do
|
||||||
|
subject { create :member_relationship }
|
||||||
|
|
||||||
|
it { is_expected.not_to validate_absence_of :role }
|
||||||
|
it { is_expected.not_to validate_presence_of :role }
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Reference in a new issue