# frozen_string_literal: true class SidebarSectionLink < ActiveRecord::Base belongs_to :user belongs_to :linkable, polymorphic: true belongs_to :sidebar_section validates :user_id, presence: true, uniqueness: { scope: %i[linkable_type linkable_id] } validates :linkable_id, presence: true validates :linkable_type, presence: true validate :ensure_supported_linkable_type, if: :will_save_change_to_linkable_type? SUPPORTED_LINKABLE_TYPES = %w[Category Tag SidebarUrl] before_validation :inherit_user_id before_create do if self.user_id && self.sidebar_section self.position = self.sidebar_section.sidebar_section_links.maximum(:position).to_i + 1 end end after_destroy { self.linkable.destroy! if self.linkable_type == "SidebarUrl" } private def inherit_user_id self.user_id = sidebar_section.user_id if sidebar_section end def ensure_supported_linkable_type if (!SUPPORTED_LINKABLE_TYPES.include?(self.linkable_type)) || (self.linkable_type == "Tag" && !SiteSetting.tagging_enabled) self.errors.add( :linkable_type, I18n.t("activerecord.errors.models.sidebar_section_link.attributes.linkable_type.invalid"), ) end end end # == Schema Information # # Table name: sidebar_section_links # # id :bigint not null, primary key # user_id :integer not null # linkable_id :integer not null # linkable_type :string not null # created_at :datetime not null # updated_at :datetime not null # sidebar_section_id :integer # position :integer default(0), not null # # Indexes # # idx_sidebar_section_links_on_sidebar_section_id (sidebar_section_id,user_id,position) UNIQUE # idx_unique_sidebar_section_links (user_id,linkable_type,linkable_id) UNIQUE # index_sidebar_section_links_on_linkable_type_and_linkable_id (linkable_type,linkable_id) #