Add constraints to table "federal_subjects"
This commit is contained in:
parent
22d55052f3
commit
fa8e437957
5 changed files with 100 additions and 4 deletions
|
@ -25,9 +25,15 @@ class FederalSubject < ApplicationRecord
|
|||
# Validations #
|
||||
###############
|
||||
|
||||
validates :english_name, presence: true, uniqueness: true
|
||||
validates :english_name,
|
||||
presence: true,
|
||||
uniqueness: true,
|
||||
length: { in: 1..255 }
|
||||
|
||||
validates :native_name, presence: true, uniqueness: true
|
||||
validates :native_name,
|
||||
presence: true,
|
||||
uniqueness: true,
|
||||
length: { in: 1..255 }
|
||||
|
||||
validates :number,
|
||||
presence: true,
|
||||
|
@ -36,6 +42,9 @@ class FederalSubject < ApplicationRecord
|
|||
|
||||
validates :timezone, presence: true, format: { with: TIMEZONE_RE }
|
||||
|
||||
validate :english_name_looks_realistic
|
||||
validate :native_name_looks_realistic
|
||||
|
||||
###########
|
||||
# Methods #
|
||||
###########
|
||||
|
@ -47,4 +56,20 @@ class FederalSubject < ApplicationRecord
|
|||
english_name
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def english_name_looks_realistic
|
||||
return if english_name.blank?
|
||||
|
||||
errors.add :english_name, :leading_spaces if english_name.start_with? ' '
|
||||
errors.add :english_name, :trailing_spaces if english_name.end_with? ' '
|
||||
end
|
||||
|
||||
def native_name_looks_realistic
|
||||
return if native_name.blank?
|
||||
|
||||
errors.add :native_name, :leading_spaces if native_name.start_with? ' '
|
||||
errors.add :native_name, :trailing_spaces if native_name.end_with? ' '
|
||||
end
|
||||
end
|
||||
|
|
|
@ -102,3 +102,5 @@ en:
|
|||
image_size: 'has too big size'
|
||||
image_format: 'has invalid format: %{content_type}'
|
||||
image_ext: 'has invalid extension: ".%{ext}"'
|
||||
leading_spaces: 'has leading spaces'
|
||||
trailing_spaces: 'has trailing spaces'
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddConstraintsToImportantTables < ActiveRecord::Migration[6.0]
|
||||
def change
|
||||
constraint :federal_subjects, :english_name, <<~SQL
|
||||
length(english_name) BETWEEN 1 AND 255
|
||||
AND
|
||||
english_name !~ '^[[:space:]]{1,}'
|
||||
AND
|
||||
english_name !~ '[[:space:]]{1,}$'
|
||||
SQL
|
||||
|
||||
constraint :federal_subjects, :native_name, <<~SQL
|
||||
length(native_name) BETWEEN 1 AND 255
|
||||
AND
|
||||
native_name !~ '^[[:space:]]{1,}'
|
||||
AND
|
||||
native_name !~ '[[:space:]]{1,}$'
|
||||
SQL
|
||||
|
||||
constraint :federal_subjects, :number, 'number > 0'
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def constraint(table, name, check)
|
||||
reversible do |dir|
|
||||
dir.up do
|
||||
execute <<~SQL
|
||||
ALTER TABLE #{table} ADD CONSTRAINT #{name} CHECK (#{check})
|
||||
SQL
|
||||
end
|
||||
|
||||
dir.down do
|
||||
execute <<~SQL
|
||||
ALTER TABLE #{table} DROP CONSTRAINT #{name}
|
||||
SQL
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -222,7 +222,10 @@ CREATE TABLE public.federal_subjects (
|
|||
english_name character varying NOT NULL,
|
||||
native_name character varying NOT NULL,
|
||||
number integer NOT NULL,
|
||||
timezone interval NOT NULL
|
||||
timezone interval NOT NULL,
|
||||
CONSTRAINT english_name CHECK ((((length((english_name)::text) >= 1) AND (length((english_name)::text) <= 255)) AND ((english_name)::text !~ '^[[:space:]]{1,}'::text) AND ((english_name)::text !~ '[[:space:]]{1,}$'::text))),
|
||||
CONSTRAINT native_name CHECK ((((length((native_name)::text) >= 1) AND (length((native_name)::text) <= 255)) AND ((native_name)::text !~ '^[[:space:]]{1,}'::text) AND ((native_name)::text !~ '[[:space:]]{1,}$'::text))),
|
||||
CONSTRAINT number CHECK ((number > 0))
|
||||
);
|
||||
|
||||
|
||||
|
@ -1124,6 +1127,7 @@ INSERT INTO "schema_migrations" (version) VALUES
|
|||
('20190718184543'),
|
||||
('20190719224405'),
|
||||
('20190720022446'),
|
||||
('20190720042127');
|
||||
('20190720042127'),
|
||||
('20190720124758');
|
||||
|
||||
|
||||
|
|
|
@ -16,13 +16,37 @@ RSpec.describe FederalSubject do
|
|||
end
|
||||
|
||||
describe '#english_name' do
|
||||
def allow_value(*)
|
||||
super.for :english_name
|
||||
end
|
||||
|
||||
it { is_expected.to validate_presence_of :english_name }
|
||||
it { is_expected.to validate_uniqueness_of :english_name }
|
||||
|
||||
it do
|
||||
is_expected.to \
|
||||
validate_length_of(:english_name).is_at_least(1).is_at_most(255)
|
||||
end
|
||||
|
||||
it { is_expected.not_to allow_value ' Foo' }
|
||||
it { is_expected.not_to allow_value 'Foo ' }
|
||||
end
|
||||
|
||||
describe '#native_name' do
|
||||
def allow_value(*)
|
||||
super.for :native_name
|
||||
end
|
||||
|
||||
it { is_expected.to validate_presence_of :native_name }
|
||||
it { is_expected.to validate_uniqueness_of :native_name }
|
||||
|
||||
it do
|
||||
is_expected.to \
|
||||
validate_length_of(:native_name).is_at_least(1).is_at_most(255)
|
||||
end
|
||||
|
||||
it { is_expected.not_to allow_value ' Foo' }
|
||||
it { is_expected.not_to allow_value 'Foo ' }
|
||||
end
|
||||
|
||||
describe '#number' do
|
||||
|
|
Reference in a new issue