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.
sqm-dashboards/app/models/category.rb

86 lines
2.2 KiB

class Category < ApplicationRecord
has_many :questions
belongs_to :parent_category, class_name: 'Category', foreign_key: :parent_category_id
has_many :child_categories, class_name: '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
[
"teachers-and-teaching-environment",
"school-culture",
"resources",
"academic-learning",
"citizenship-and-wellbeing",
"pilot-family-questions"
].index(root_identifier) || 0
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)
return 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|
if cc.zones.nil?
cc.sync_child_zones
end
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
if 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