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 |