From e934e08c178aafed29305ee1dc0178d09bf5e1af Mon Sep 17 00:00:00 2001 From: Urban Rotnik Date: Fri, 6 Dec 2019 12:50:19 +0100 Subject: [PATCH] Implement STI for DateTimeValue types --- app/models/repository_cell.rb | 14 +------ app/models/repository_date_range_value.rb | 4 ++ .../repository_date_time_range_value.rb | 21 +---------- .../repository_date_time_range_value_base.rb | 25 +++++++++++++ app/models/repository_date_time_value.rb | 33 +---------------- app/models/repository_date_time_value_base.rb | 37 +++++++++++++++++++ app/models/repository_date_value.rb | 4 ++ app/models/repository_time_range_value.rb | 4 ++ app/models/repository_time_value.rb | 4 ++ ..._add_type_to_repository_date_time_value.rb | 8 ++++ db/structure.sql | 9 +++-- 11 files changed, 95 insertions(+), 68 deletions(-) create mode 100644 app/models/repository_date_range_value.rb create mode 100644 app/models/repository_date_time_range_value_base.rb create mode 100644 app/models/repository_date_time_value_base.rb create mode 100644 app/models/repository_date_value.rb create mode 100644 app/models/repository_time_range_value.rb create mode 100644 app/models/repository_time_value.rb create mode 100644 db/migrate/20191206105058_add_type_to_repository_date_time_value.rb diff --git a/app/models/repository_cell.rb b/app/models/repository_cell.rb index 1905ee6fb..32ac210c6 100644 --- a/app/models/repository_cell.rb +++ b/app/models/repository_cell.rb @@ -80,20 +80,8 @@ class RepositoryCell < ApplicationRecord private def repository_column_data_type - if !repository_column || value_type != repository_column.data_type && !date_time_compatibility_checks + if !repository_column || value_type != repository_column.data_type errors.add(:value_type, 'must match column data type') end end - - def date_time_compatibility_checks - case value_type - when 'RepositoryDateTimeValue' - %w(RepositoryTimeValue RepositoryDateTimeValue RepositoryDateValue).include?(repository_column.data_type) - when 'RepositoryDateTimeRangeValue' - %w(RepositoryTimeRangeValue RepositoryDateTimeRangeValue RepositoryDateRangeValue) - .include?(repository_column.data_type) - else - false - end - end end diff --git a/app/models/repository_date_range_value.rb b/app/models/repository_date_range_value.rb new file mode 100644 index 000000000..cc34a5ce3 --- /dev/null +++ b/app/models/repository_date_range_value.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +class RepositoryDateRangeValue < RepositoryDateTimeRangeValueBase +end diff --git a/app/models/repository_date_time_range_value.rb b/app/models/repository_date_time_range_value.rb index c7e7d1cdd..3804a1b62 100644 --- a/app/models/repository_date_time_range_value.rb +++ b/app/models/repository_date_time_range_value.rb @@ -1,23 +1,4 @@ # frozen_string_literal: true -class RepositoryDateTimeRangeValue < ApplicationRecord - belongs_to :created_by, foreign_key: :created_by_id, class_name: 'User', optional: true, - inverse_of: :created_repositroy_date_time_values - belongs_to :last_modified_by, foreign_key: :last_modified_by_id, class_name: 'User', optional: true, - inverse_of: :modified_repositroy_date_time_values - has_one :repository_cell, as: :value, dependent: :destroy, inverse_of: :repository_date_time_value - accepts_nested_attributes_for :repository_cell - - validates :repository_cell, :start_time, :end_time, presence: true - - SORTABLE_COLUMN_NAME = 'repository_date_time_values.start_time' - SORTABLE_VALUE_INCLUDE = :repository_date_time_range_value - - def formatted - data - end - - def data - [start_time, end_time].compact.join(' - ') - end +class RepositoryDateTimeRangeValue < RepositoryDateTimeRangeValueBase end diff --git a/app/models/repository_date_time_range_value_base.rb b/app/models/repository_date_time_range_value_base.rb new file mode 100644 index 000000000..83f6e7bc9 --- /dev/null +++ b/app/models/repository_date_time_range_value_base.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +class RepositoryDateTimeRangeValueBase < ApplicationRecord + self.table_name = 'repository_date_time_range_values' + + belongs_to :created_by, foreign_key: :created_by_id, class_name: 'User', optional: true, + inverse_of: :created_repositroy_date_time_values + belongs_to :last_modified_by, foreign_key: :last_modified_by_id, class_name: 'User', optional: true, + inverse_of: :modified_repositroy_date_time_values + has_one :repository_cell, as: :value, dependent: :destroy, inverse_of: :repository_date_time_value + accepts_nested_attributes_for :repository_cell + + validates :repository_cell, :start_time, :end_time, presence: true + + SORTABLE_COLUMN_NAME = 'repository_date_time_values.start_time' + SORTABLE_VALUE_INCLUDE = :repository_date_time_range_value + + def formatted + data + end + + def data + [start_time, end_time].compact.join(' - ') + end +end diff --git a/app/models/repository_date_time_value.rb b/app/models/repository_date_time_value.rb index 2f55c2ee3..5db8ce071 100644 --- a/app/models/repository_date_time_value.rb +++ b/app/models/repository_date_time_value.rb @@ -1,35 +1,4 @@ # frozen_string_literal: true -class RepositoryDateTimeValue < ApplicationRecord - belongs_to :created_by, foreign_key: :created_by_id, class_name: 'User', optional: true, - inverse_of: :created_repositroy_date_time_values - belongs_to :last_modified_by, foreign_key: :last_modified_by_id, class_name: 'User', optional: true, - inverse_of: :modified_repositroy_date_time_values - has_one :repository_cell, as: :value, dependent: :destroy, inverse_of: :repository_date_time_value - accepts_nested_attributes_for :repository_cell - - validates :repository_cell, :data, presence: true - - SORTABLE_COLUMN_NAME = 'repository_date_time_values.data' - SORTABLE_VALUE_INCLUDE = :repository_date_time_value - - def formatted - data - end - - def data_changed?(new_data) - new_data != data - end - - def update_data!(new_data, user) - self.data = new_data - self.last_modified_by = user - save! - end - - def self.new_with_payload(payload, attributes) - value = new(attributes) - value.data = payload - value - end +class RepositoryDateTimeValue < RepositoryDateTimeValueBase end diff --git a/app/models/repository_date_time_value_base.rb b/app/models/repository_date_time_value_base.rb new file mode 100644 index 000000000..49ab0d1c2 --- /dev/null +++ b/app/models/repository_date_time_value_base.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +class RepositoryDateTimeValueBase < ApplicationRecord + self.table_name = 'repository_date_time_values' + + belongs_to :created_by, foreign_key: :created_by_id, class_name: 'User', optional: true, + inverse_of: :created_repositroy_date_time_values + belongs_to :last_modified_by, foreign_key: :last_modified_by_id, class_name: 'User', optional: true, + inverse_of: :modified_repositroy_date_time_values + has_one :repository_cell, as: :value, dependent: :destroy, inverse_of: :repository_date_time_value + accepts_nested_attributes_for :repository_cell + + validates :repository_cell, :data, presence: true + + SORTABLE_COLUMN_NAME = 'repository_date_time_values.data' + SORTABLE_VALUE_INCLUDE = :repository_date_time_value + + def formatted + data + end + + def data_changed?(new_data) + new_data != data + end + + def update_data!(new_data, user) + self.data = new_data + self.last_modified_by = user + save! + end + + def self.new_with_payload(payload, attributes) + value = new(attributes) + value.data = payload + value + end +end diff --git a/app/models/repository_date_value.rb b/app/models/repository_date_value.rb new file mode 100644 index 000000000..9014284ac --- /dev/null +++ b/app/models/repository_date_value.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +class RepositoryDateValue < RepositoryDateTimeValueBase +end diff --git a/app/models/repository_time_range_value.rb b/app/models/repository_time_range_value.rb new file mode 100644 index 000000000..d6c33224d --- /dev/null +++ b/app/models/repository_time_range_value.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +class RepositoryTimeRangeValue < RepositoryDateTimeRangeValueBase +end diff --git a/app/models/repository_time_value.rb b/app/models/repository_time_value.rb new file mode 100644 index 000000000..5728ff009 --- /dev/null +++ b/app/models/repository_time_value.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +class RepositoryTimeValue < RepositoryDateTimeValueBase +end diff --git a/db/migrate/20191206105058_add_type_to_repository_date_time_value.rb b/db/migrate/20191206105058_add_type_to_repository_date_time_value.rb new file mode 100644 index 000000000..e20fae7d1 --- /dev/null +++ b/db/migrate/20191206105058_add_type_to_repository_date_time_value.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class AddTypeToRepositoryDateTimeValue < ActiveRecord::Migration[6.0] + def change + add_column :repository_date_time_values, :type, :string + add_column :repository_date_time_range_values, :type, :string + end +end diff --git a/db/structure.sql b/db/structure.sql index a2de1236a..57479ec12 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -1236,7 +1236,8 @@ CREATE TABLE public.repository_date_time_range_values ( last_modified_by_id bigint, created_by_id bigint, created_at timestamp(6) without time zone NOT NULL, - updated_at timestamp(6) without time zone NOT NULL + updated_at timestamp(6) without time zone NOT NULL, + type character varying ); @@ -1269,7 +1270,8 @@ CREATE TABLE public.repository_date_time_values ( created_at timestamp without time zone, updated_at timestamp without time zone, created_by_id bigint NOT NULL, - last_modified_by_id bigint NOT NULL + last_modified_by_id bigint NOT NULL, + type character varying ); @@ -6845,6 +6847,7 @@ INSERT INTO "schema_migrations" (version) VALUES ('20191007144622'), ('20191009146101'), ('20191105143702'), -('20191115143747'); +('20191115143747'), +('20191206105058');