# frozen_string_literal: true class Element < ApplicationRecord has_rich_text :description belongs_to :page, touch: true has_many :success_criteria, dependent: :destroy delegate :report, to: :page after_validation :set_position # Calculate actual conformity level: # - if a success_criterion has result :failed -> the confirmity_level # of that success_criterion is not reached. # - the resulting level is the highest readched level # abeying rule above. def level return nil return nil unless success_criteria.all(&:result) min_failed = success_criteria.select(&:failed?).map(&:level).min possible_levels = success_criteria.select(&:passed?).map(&:level).uniq return nil if possible_levels.empty? Rails.logger.debug possible_levels.inspect Rails.logger.debug min_failed possible_levels[possible_levels.find_index(min_failed) - 1] end def max_level @max_level ||= success_criteria.reject(&:not_applicable?).max(&:level) end def set_position Rails.logger.debug("element: position #{position}") self.position ||= (page.elements.pluck(:position).max || 0) + 1 end end