# frozen_string_literal: true class CharacterSheetSection < ApplicationRecord belongs_to :character belongs_to :parent_section, optional: true, class_name: "CharacterSheetSection" has_many :character_sheet_subsections, class_name: "CharacterSheetSection", foreign_key: :parent_section_id, dependent: :destroy has_many :character_sheet_features has_many :stats, dependent: :destroy, through: :character_sheet_features, source: :featurable, source_type: "Stat" has_many :text_fields, dependent: :destroy, through: :character_sheet_features, source: :featurable, source_type: "TextField" validates :name, presence: true, length: { maximum: 255 } scope :top_level, -> { where.missing(:parent_section) } def lowest_order_index character_sheet_features.minimum(:order_index) || 1 end def highest_order_index character_sheet_features.maximum(:order_index) || 1 end def self.deserialize(h) section = new h["character_sheet_subsections"].each do |sub| section.character_sheet_subsections.deserialize(sub) end h["stats"].each do |stat| section.stats.build(stat) end h["text_fields"].each do |text_field| section.text_fields.build(text_field) end section end end