You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.5 KiB
94 lines
2.5 KiB
module Legacy
|
|
class Category < ApplicationRecord
|
|
has_many :questions
|
|
belongs_to :parent_category, class_name: "Legacy::Category", foreign_key: :parent_category_id, optional: true
|
|
has_many :child_categories, class_name: "Legacy::Category", foreign_key: :parent_category_id
|
|
has_many :school_categories
|
|
|
|
validates :name, presence: true
|
|
|
|
scope :for_parent, ->(category = nil) { where(parent_category_id: category.try(:id)) }
|
|
scope :likert, -> { where("benchmark is null") }
|
|
|
|
include FriendlyId
|
|
friendly_id :name, use: [:slugged]
|
|
|
|
def path
|
|
p = self
|
|
items = [p]
|
|
items << p while (p = p.try(:parent_category))
|
|
items.uniq.compact.reverse
|
|
end
|
|
|
|
def root_identifier
|
|
path.first.name.downcase.gsub(/\s/, "-")
|
|
end
|
|
|
|
def root_index
|
|
Category.root_identifiers.index(root_identifier) || 0
|
|
end
|
|
|
|
def self.root_identifiers
|
|
%w[
|
|
teachers-and-the-teaching-environment
|
|
school-culture
|
|
resources
|
|
academic-learning
|
|
community-and-wellbeing
|
|
pilot-family-questions
|
|
]
|
|
end
|
|
|
|
def self.root
|
|
Category.where(parent_category: nil).select { |c| root_identifiers.index(c.slug) }
|
|
end
|
|
|
|
def custom_zones
|
|
return [] if zones.nil?
|
|
|
|
zones.split(",").map(&:to_f)
|
|
end
|
|
|
|
def zone_widths
|
|
return nil if zones.nil?
|
|
|
|
widths = custom_zones.each_with_index.map do |zone, index|
|
|
(zone - (index == 0 ? 0 : custom_zones[index - 1])).round(2)
|
|
end
|
|
|
|
widths[4] = widths[4] + (5 - widths.sum)
|
|
widths
|
|
end
|
|
|
|
def sync_child_zones
|
|
likert_child_categories = child_categories.likert
|
|
return unless likert_child_categories.present?
|
|
|
|
total_zones = [0, 0, 0, 0, 0]
|
|
valid_child_categories = 0
|
|
likert_child_categories.each do |cc|
|
|
cc.sync_child_zones if cc.zones.nil?
|
|
|
|
if cc.zones.nil?
|
|
puts "NO ZONES: #{name} -> #{cc.name}"
|
|
else
|
|
valid_child_categories += 1
|
|
|
|
puts "ZONES: #{name} | #{cc.name} | #{cc.zones}"
|
|
|
|
cc.custom_zones.each_with_index do |zone, index|
|
|
puts "ZONE: #{name} | #{zone} | #{index}"
|
|
total_zones[index] += zone
|
|
end
|
|
end
|
|
end
|
|
|
|
return unless valid_child_categories > 0
|
|
|
|
average_zones = total_zones.map { |zone| zone / valid_child_categories }
|
|
puts "TOTAL: #{name} | #{total_zones} | #{valid_child_categories} | #{average_zones} | #{zone_widths}"
|
|
update(zones: average_zones.join(","))
|
|
end
|
|
end
|
|
end
|