module ActsAsTaggableOn
module Taggable
def taggable?
false
end
##
# This is an alias for calling acts_as_taggable_on :tags.
#
# Example:
# class Book < ActiveRecord::Base
# acts_as_taggable
# end
def acts_as_taggable
acts_as_taggable_on :tags
end
##
# This is an alias for calling acts_as_ordered_taggable_on :tags.
#
# Example:
# class Book < ActiveRecord::Base
# acts_as_ordered_taggable
# end
def acts_as_ordered_taggable
acts_as_ordered_taggable_on :tags
end
##
# Make a model taggable on specified contexts.
#
# @param [Array] tag_types An array of taggable contexts
#
# Example:
# class User < ActiveRecord::Base
# acts_as_taggable_on :languages, :skills
# end
def acts_as_taggable_on(*tag_types)
taggable_on(false, tag_types)
end
##
# Make a model taggable on specified contexts
# and preserves the order in which tags are created
#
# @param [Array] tag_types An array of taggable contexts
#
# Example:
# class User < ActiveRecord::Base
# acts_as_ordered_taggable_on :languages, :skills
# end
def acts_as_ordered_taggable_on(*tag_types)
taggable_on(true, tag_types)
end
private
# Make a model taggable on specified contexts
# and optionally preserves the order in which tags are created
#
# Separate methods used above for backwards compatibility
# so that the original acts_as_taggable_on method is unaffected
# as it's not possible to add another argument to the method
# without the tag_types being enclosed in square brackets
#
# NB: method overridden in core module in order to create tag type
# associations and methods after this logic has executed
#
def taggable_on(preserve_tag_order, *tag_types)
tag_types = tag_types.to_a.flatten.compact.map(&:to_sym)
if taggable?
self.tag_types = (self.tag_types + tag_types).uniq
self.preserve_tag_order = preserve_tag_order
else
class_attribute :tag_types
self.tag_types = tag_types
class_attribute :preserve_tag_order
self.preserve_tag_order = preserve_tag_order
class_eval do
has_many :taggings, as: :taggable, dependent: :destroy, class_name: '::ActsAsTaggableOn::Tagging'
has_many :base_tags, through: :taggings, source: :tag, class_name: '::ActsAsTaggableOn::Tag'
def self.taggable?
true
end
end
end
# each of these add context-specific methods and must be
# called on each call of taggable_on
include Core
include Collection
include Cache
include Ownership
include Related
end
end
end