Tasks display
This commit is contained in:
+26
-2
@@ -2,17 +2,41 @@
|
||||
|
||||
class Project < ApplicationRecord
|
||||
validates :name, :code, presence: true
|
||||
validates :code, exclusion: { in: %w[new] }, uniqueness: true
|
||||
validates :code, exclusion: { in: %w[new] }, uniqueness: true, format: { with: /\A[a-z]{2,}\z/ }
|
||||
|
||||
has_many :tasks, dependent: :restrict_with_exception
|
||||
|
||||
has_rich_text :description
|
||||
|
||||
normalizes :code, with: ->(code) { code.strip.downcase }
|
||||
normalizes :code, with: ->(code) { code.strip.downcase.gsub(/\W+/, '') }
|
||||
|
||||
after_commit :create_tasks_number_sequence, on: :create
|
||||
after_destroy_commit :drop_tasks_number_sequence
|
||||
|
||||
def to_param
|
||||
return unless id
|
||||
|
||||
code
|
||||
end
|
||||
|
||||
def tasks_number_sequence_name
|
||||
"_seq_projects__#{code}_tasks_number"
|
||||
end
|
||||
|
||||
def next_task_number
|
||||
result = self.class.connection.exec_query "SELECT NEXT VALUE FOR #{tasks_number_sequence_name} AS task_number"
|
||||
raise "Expected one result, got #{result.count}" unless result.one?
|
||||
|
||||
result.first['task_number']
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def create_tasks_number_sequence
|
||||
self.class.connection.execute "CREATE SEQUENCE IF NOT EXISTS #{tasks_number_sequence_name} AS INT UNSIGNED"
|
||||
end
|
||||
|
||||
def drop_tasks_number_sequence
|
||||
self.class.connection.execute "DROP SEQUENCE IF EXISTS #{tasks_number_sequence_name}"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class Task < ApplicationRecord
|
||||
belongs_to :project
|
||||
|
||||
@@ -5,4 +7,22 @@ class Task < ApplicationRecord
|
||||
validates :number, numericality: { greater_than: 0 }
|
||||
|
||||
has_rich_text :description
|
||||
|
||||
def to_param
|
||||
return full_number if association(:project).loaded?
|
||||
|
||||
super
|
||||
end
|
||||
|
||||
def full_number
|
||||
"#{project.code.upcase}-#{number}"
|
||||
end
|
||||
|
||||
def self.find_by_full_number_or_id!(number_or_id)
|
||||
return find!(number_or_id) if number_or_id.is_a?(Numeric) || number_or_id =~ /\A\d+\z/
|
||||
|
||||
project_code, number = number_or_id.split('-')
|
||||
project = Project.find_by!(code: project_code.downcase)
|
||||
find_by!(project:, number:)
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user