module ActsAsTaggable::ActMethod
def acts_as_taggable(options = {})
def acts_as_taggable(options = {}) class_attribute :acts_as_taggable_options self.acts_as_taggable_options = options self.acts_as_taggable_options.reverse_merge! :delimiter => ',', :downcase => true, :remove_tag_if_empty => true self.acts_as_taggable_options.reverse_merge! :output_delimiter => acts_as_taggable_options[:delimiter] self.acts_as_taggable_options[:types] = Array(self.acts_as_taggable_options[:types]) has_many :taggings, -> { order("#{Tagging.table_name}.id") }, :as => :taggable, :after_remove => :delete_tag_if_necessary, :dependent => :destroy, :class_name => 'ActsAsTaggable::Tagging' has_many :tags, :through => :taggings, :class_name => 'ActsAsTaggable::Tag', :after_add => :reset_scoped_associations extend ClassMethods include InstanceMethods self.acts_as_taggable_options[:types].each do |tag_type| has_many :"#{tag_type}_taggings", -> { joins(:tag).order("#{Tagging.table_name}.id").where(Tag.table_name => {:tag_type => tag_type}) }, :as => :taggable, :after_add => :reset_associations, :after_remove => :delete_tag_if_necessary, :class_name => 'ActsAsTaggable::Tagging' has_many :"#{tag_type}_tags", -> { where(:tag_type => tag_type) }, :through => :taggings, :source => :tag, :class_name => 'ActsAsTaggable::Tag', :after_add => :reset_associations metaclass = class << self; self; end HelperMethods.scope_class_methods(metaclass, tag_type) HelperMethods.scope_instance_methods(self, tag_type) end end