1
0
Fork 0

Add model Contact

This commit is contained in:
Alex Kotov 2019-08-11 05:23:12 +05:00
parent 29a1c6355d
commit 15cf8f0449
Signed by: kotovalexarian
GPG Key ID: 553C0EBBEB5D5F08
5 changed files with 183 additions and 0 deletions

37
app/models/contact.rb Normal file
View File

@ -0,0 +1,37 @@
# frozen_string_literal: true
class Contact < ApplicationRecord
################
# Associations #
################
belongs_to :contact_list
belongs_to :contact_network
#############
# Callbacks #
#############
before_validation :turn_blanks_into_nils
before_validation :strip_extra_spaces
###############
# Validations #
###############
validates :contact_list, presence: true
validates :contact_network, presence: true
validates :value, presence: true
private
def turn_blanks_into_nils
self.value = nil if value.blank?
end
def strip_extra_spaces
self.value = value&.strip
end
end

View File

@ -147,6 +147,15 @@ private
t.timestamps null: false
end
create_table :contacts do |t|
t.timestamps null: false
t.references :contact_list, null: false, index: true, foreign_key: true
t.references :contact_network, null: false, index: true, foreign_key: true
t.string :value, null: false
end
create_table :federal_subjects do |t|
t.timestamps null: false
@ -349,6 +358,10 @@ private
end
def change_constraints
constraint :contacts, :value, <<~SQL
is_good_small_text(value)
SQL
constraint :contact_networks, :nickname, <<~SQL
is_nickname(nickname)
SQL

View File

@ -437,6 +437,40 @@ CREATE SEQUENCE public.contact_networks_id_seq
ALTER SEQUENCE public.contact_networks_id_seq OWNED BY public.contact_networks.id;
--
-- Name: contacts; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE public.contacts (
id bigint NOT NULL,
created_at timestamp(6) without time zone NOT NULL,
updated_at timestamp(6) without time zone NOT NULL,
contact_list_id bigint NOT NULL,
contact_network_id bigint NOT NULL,
value character varying NOT NULL,
CONSTRAINT value CHECK (public.is_good_small_text((value)::text))
);
--
-- Name: contacts_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE public.contacts_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: contacts_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE public.contacts_id_seq OWNED BY public.contacts.id;
--
-- Name: federal_subjects; Type: TABLE; Schema: public; Owner: -
--
@ -859,6 +893,13 @@ ALTER TABLE ONLY public.contact_lists ALTER COLUMN id SET DEFAULT nextval('publi
ALTER TABLE ONLY public.contact_networks ALTER COLUMN id SET DEFAULT nextval('public.contact_networks_id_seq'::regclass);
--
-- Name: contacts id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.contacts ALTER COLUMN id SET DEFAULT nextval('public.contacts_id_seq'::regclass);
--
-- Name: federal_subjects id; Type: DEFAULT; Schema: public; Owner: -
--
@ -978,6 +1019,14 @@ ALTER TABLE ONLY public.contact_networks
ADD CONSTRAINT contact_networks_pkey PRIMARY KEY (id);
--
-- Name: contacts contacts_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.contacts
ADD CONSTRAINT contacts_pkey PRIMARY KEY (id);
--
-- Name: federal_subjects federal_subjects_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
@ -1135,6 +1184,20 @@ CREATE UNIQUE INDEX index_contact_networks_on_nickname ON public.contact_network
CREATE UNIQUE INDEX index_contact_networks_on_public_name ON public.contact_networks USING btree (public_name);
--
-- Name: index_contacts_on_contact_list_id; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_contacts_on_contact_list_id ON public.contacts USING btree (contact_list_id);
--
-- Name: index_contacts_on_contact_network_id; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_contacts_on_contact_network_id ON public.contacts USING btree (contact_network_id);
--
-- Name: index_federal_subjects_on_english_name; Type: INDEX; Schema: public; Owner: -
--
@ -1395,6 +1458,14 @@ ALTER TABLE ONLY public.user_omniauths
ADD CONSTRAINT fk_rails_8c1c9cb22e FOREIGN KEY (user_id) REFERENCES public.users(id);
--
-- Name: contacts fk_rails_8dffd7a589; Type: FK CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.contacts
ADD CONSTRAINT fk_rails_8dffd7a589 FOREIGN KEY (contact_network_id) REFERENCES public.contact_networks(id);
--
-- Name: account_roles fk_rails_a85be4ccfd; Type: FK CONSTRAINT; Schema: public; Owner: -
--
@ -1435,6 +1506,14 @@ ALTER TABLE ONLY public.relationships
ADD CONSTRAINT fk_rails_d60748ff4c FOREIGN KEY (person_id) REFERENCES public.people(id);
--
-- Name: contacts fk_rails_dd2a5400cf; Type: FK CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.contacts
ADD CONSTRAINT fk_rails_dd2a5400cf FOREIGN KEY (contact_list_id) REFERENCES public.contact_lists(id);
--
-- Name: account_roles fk_rails_f48937287f; Type: FK CONSTRAINT; Schema: public; Owner: -
--

10
factories/contacts.rb Normal file
View File

@ -0,0 +1,10 @@
# frozen_string_literal: true
FactoryBot.define do
factory :some_contact, class: Contact do
association :contact_list, factory: :empty_contact_list
association :contact_network
value { Faker::Internet.username }
end
end

View File

@ -0,0 +1,44 @@
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe Contact do
subject { create :some_contact }
describe '#contact_list' do
it { is_expected.to belong_to(:contact_list) }
it { is_expected.to validate_presence_of :contact_list }
end
describe '#contact_network' do
it { is_expected.to belong_to(:contact_network) }
it { is_expected.to validate_presence_of :contact_network }
end
describe '#value' do
def allow_value(*)
super.for :value
end
it { is_expected.to validate_presence_of :value }
it { is_expected.not_to allow_value nil }
it { is_expected.not_to allow_value '' }
it { is_expected.not_to allow_value ' ' * rand(1..3) }
it { is_expected.to allow_value Faker::Internet.username }
context 'when it was set to blank string' do
subject { build :some_contact, value: value }
let(:value) { ' ' * rand(1..3) }
specify do
expect { subject.validate }.to \
change(subject, :value).from(value).to(nil)
end
end
end
end