scinote-web/app/models/repository_column.rb

73 lines
2.6 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
2017-06-23 21:19:08 +08:00
class RepositoryColumn < ApplicationRecord
belongs_to :repository
belongs_to :created_by, foreign_key: :created_by_id, class_name: 'User'
has_many :repository_cells, dependent: :destroy
has_many :repository_rows, through: :repository_cells
has_many :repository_list_items, dependent: :destroy, index_errors: true
2019-10-09 21:18:51 +08:00
has_many :repository_status_items, dependent: :destroy, index_errors: true
2019-12-09 20:38:40 +08:00
has_many :repository_checklist_items, dependent: :destroy, index_errors: true
2019-10-09 21:18:51 +08:00
2019-10-11 15:41:22 +08:00
accepts_nested_attributes_for :repository_status_items, allow_destroy: true
accepts_nested_attributes_for :repository_list_items, allow_destroy: true
2019-12-09 20:38:40 +08:00
accepts_nested_attributes_for :repository_checklist_items, allow_destroy: true
enum data_type: Extends::REPOSITORY_DATA_TYPES
auto_strip_attributes :name, nullify: false
validates :name,
length: { maximum: Constants::NAME_MAX_LENGTH },
uniqueness: { scope: :repository_id, case_sensitive: true }
2019-11-19 19:10:38 +08:00
validates :name, :data_type, :repository, :created_by, presence: true
2017-06-06 23:35:29 +08:00
after_create :update_repository_table_states_with_new_column
around_destroy :update_repository_table_states_with_removed_column
2017-06-06 23:35:29 +08:00
scope :list_type, -> { where(data_type: 'RepositoryListValue') }
scope :asset_type, -> { where(data_type: 'RepositoryAssetValue') }
scope :status_type, -> { where(data_type: 'RepositoryStatusValue') }
2019-12-09 20:38:40 +08:00
scope :checkbox_type, -> { where(data_type: 'RepositoryChecklistValue') }
def self.name_like(query)
where('repository_columns.name ILIKE ?', "%#{query}%")
end
2019-11-19 19:10:38 +08:00
# Add enum check method with underscores (eg repository_list_value)
data_types.each do |k, _|
define_method "#{k.underscore}?" do
public_send "#{k}?"
end
end
def update_repository_table_states_with_new_column
service = RepositoryTableStateColumnUpdateService.new
service.update_states_with_new_column(repository)
end
def update_repository_table_states_with_removed_column
# Calculate old_column_index - this can only be done before
# record is deleted when we still have its index
old_column_index = (
Constants::REPOSITORY_TABLE_DEFAULT_STATE['length'] +
repository.repository_columns
.order(id: :asc)
.pluck(:id)
.index(id)
)
# Perform the destroy itself
yield
# Update repository table states
service = RepositoryTableStateColumnUpdateService.new
service.update_states_with_removed_column(
repository, old_column_index
)
2017-06-06 23:35:29 +08:00
end
def importable?
Extends::REPOSITORY_IMPORTABLE_TYPES.include?(data_type.to_sym)
end
end