Sha256: fc8814025d621a02aa49e1230533fee2121228a107ae83985a05cb700328ea38

Contents?: true

Size: 1.33 KB

Versions: 2

Compression:

Stored size: 1.33 KB

Contents

# encoding: utf-8

class Tag < ActiveRecord::Base
  include PagesCore::HumanizableParam
  has_many :taggings

  scope :pinned, -> { where(pinned: true) }
  scope :sorted, -> { order("pinned DESC, name ASC") }

  class << self
    def tags_and_suggestions_for(taggable, options = {})
      options = default_options.merge(options)
      tags = (taggable.tags.sorted + pinned.sorted).uniq
      if tags.count < options[:limit]
        suggested = suggestions(tags, options)
        tags = tags.to_a + suggested[0...(options[:limit] - tags.length)]
      end
      tags
    end

    def parse(*tags)
      Array(tags).flatten
        .map { |tag| tag.is_a?(Tag) ? tag.name : tag }
        .map { |tag| tag.split(",") }
        .flatten
        .map(&:strip)
    end

    private

    def suggestions(tags, options = {})
      Tag.joins(:taggings)
        .select("`tags`.*, COUNT(`tags`.id) AS counter")
        .group("`tags`.id")
        .order("counter DESC")
        .limit(options[:limit])
        .reject { |t| tags.include?(t) }
    end

    def default_options
      { limit: 100 }
    end
  end

  def tagged
    @tagged ||= taggings.collect(&:taggable)
  end

  def on(taggable)
    taggings.create(taggable: taggable)
  end

  def ==(other)
    super || name == other.to_s
  end

  def to_param
    humanized_param(name)
  end

  def to_s
    name
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
pages_core-3.4.3 app/models/tag.rb
pages_core-3.4.2 app/models/tag.rb