60 lines
2.0 KiB
Ruby
60 lines
2.0 KiB
Ruby
# 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)
|
|
#
|