Sha256: e9ef9d1fc1a20ff51b5d5974fd44beb432942af21bab7ebca8e060d33b8df78a

Contents?: true

Size: 1.54 KB

Versions: 1

Compression:

Stored size: 1.54 KB

Contents

class HaystackTag < BaseTag
  belongs_to :parent_tag, class_name: "HaystackTag", optional: true
  has_many :children, class_name: "HaystackTag", foreign_key: "parent_tag_id", dependent: :destroy, inverse_of: :parent_tag
  has_many :haystack_taggings, dependent: :destroy
  has_many :taggables, through: :haystack_taggings, source: :taggable

  validates :name, presence: true, uniqueness: true
  validates :description, presence: true
  validate :prevent_circular_reference

  def ancestors
    ancestors = []
    current = self
    while current.parent_tag
      break if ancestors.include?(current.parent_tag) # Voorkom oneindige lus
      ancestors << current.parent_tag
      current = current.parent_tag
    end
    ancestors
  end

  def full_path
    ancestors.reverse.map(&:name).join(" > ") + " > " + name
  end

  def self.find_by_path(path)
    keys = path.split(".")
    current = nil
      keys.each do |key|
      current = current ? current.children.find_by(name: key) : find_by(name: key)
      return nil unless current
    end
    current
  end

  def descendants
    children + children.flat_map(&:descendants)
  end

  def siblings
    parent_tag ? parent_tag.children.where.not(id: id) : self.class.where(parent_tag_id: nil).where.not(id: id)
  end

  def root?
    parent_tag.nil?
  end

  def leaf?
    children.empty?
  end

  def depth
    ancestors.size
  end

  private

  def prevent_circular_reference
    if parent_tag == self || ancestors.include?(self)
      errors.add(:parent_tag, "kan geen circulaire referentie bevatten")
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
needle_in_a_haystack-1.0.5 lib/needle_in_a_haystack/models/haystack_tag.rb